Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33748 liuyile 【S】T4 C++ 运行出错 20 48 MS 316 KB 2533 2024-10-20 21:28:25

Tests(2/10):


#include<bits/stdc++.h> using namespace std; #define int long long const int N=510+10; int f[N],g[N]; int p[N],q[N]; int n,a[N]; int L[N],R[N]; int t[2*N]; inline int lb(int x){return x&-x;} const int M=998244353; inline void add(int &x,int y){ if((x+=y)>=M)x-=M; } inline void mod(int x,int k){ while(x<=2*n)add(t[x],k),x+=lb(x); } inline int gt(int x){ int res=0; while(x)add(res,t[x]),x-=lb(x); return res; } inline void calcf(int l,int r){ if(l==r){ if(a[l]==1)add(f[l],f[l-1]); return ; } int mid=l+r>>1; calcf(l,mid); R[mid+1]=a[mid+1]; L[mid]=a[mid]; for(int i=mid-1;i>=l;i--)L[i]=max(L[i+1],a[i]); for(int i=mid+2;i<=r;i++)R[i]=max(R[i-1],a[i]); for(int i=l;i<=mid;i++)mod(L[i]+i,f[i-1]); int lp=mid+1,rp=mid; int s=0; for(int ri=mid+1;ri<=r;ri++){ while(lp!=l&&L[lp-1]<R[ri])lp--,s+=f[lp-1],mod(L[lp]+lp,M-f[lp-1]); while(ri-rp+1<R[ri]&&rp>=lp)s-=f[rp-1],rp--; while(rp!=mid&&ri-rp>=R[ri])rp++,s+=f[rp-1]; add(f[ri],(s+gt(ri+1))%M); // int p=0; // int mx=0; // if(l==1&&r==125&&ri==83)cout<<rp<<endl; // for(int li=l;li<=mid;li++) // if(R[ri]>L[li]&&ri-li+1>=max(L[li],R[ri])){add(f[ri],f[li-1]),add(p,f[li-1]),mx=max(mx,li); // // if(l==1&&r==125&&ri==83)cout<<li<<"x"<<ri-li+1<<endl;; // } // // if(s%M!=p){ // // cout<<"???"<<endl; // // cout<<l<<" "<<r<<" "<<mid<<" "<<ri<<" "<<s<<" "<<p<<" "<<lp<<" "<<rp<<" "<<ri-rp+1<<" "<<R[ri]<<endl; // // cout<<mx<<endl; // // exit(0); // // } // add(f[ri],gt(ri+1)); } while(lp!=l)lp--,mod(L[lp]+lp,M-f[lp-1]); // memset(t,0,sizeof(t)); // cout<<l<<" "<<r<<" "<<mid<<" "<<f[4]<<endl; calcf(mid+1,r); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("3.in","r",stdin); // freopen("divide.out","w",stdout); cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++){ memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); int x=a[i]; a[i]=1; f[0]=1,g[n+1]=1; calcf(1,n); // for(int i=1;i<=n;i++) // cout<<f[i]<<" "; // cout<<endl; a[i]=x; cout<<f[n]<<" "; } cout<<endl; for(int i=1;i<=n;i++) p[i]=f[i-1],q[i]=g[i+1]; cout.flush(); return 0; }


测评信息: