Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
33751 liuyile 【S】T4 C++ 运行超时 0 1000 MS 13104 KB 2597 2024-10-21 20:36:30

Tests(0/10):


#include<bits/stdc++.h> using namespace std; #define int long long const int N=2e5+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){ x+=n; while(x<=2*n)add(t[x],k),x+=lb(x); } inline int gt(int x){ x+=n; 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); } while(lp!=l)lp--,mod(L[lp]+lp,M-f[lp-1]); calcf(mid+1,r); } inline void calcg(int l,int r){ // cout<<l<<" "<<r<<endl; if(l==r){ if(a[r]==1)add(g[l],g[l+1]); return ; } int mid=l+r>>1; calcg(mid+1,r); 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=mid+1;i<=r;i++)mod(i-R[i]+1,g[i+1]); int lp=mid+1,rp=mid; int s=0; for(int li=mid;li>=l;li--){ while(rp!=r&&R[rp+1]<L[li])rp++,s+=g[rp+1],mod(rp-R[rp]+1,M-g[rp+1]); while(lp-li+1<L[li]&&lp<=rp)s-=g[lp+1],lp++; while(lp!=mid+1&&lp-li>=L[li])lp--,s+=g[lp+1]; add(g [li],(s+gt(n)-gt(li-1))); } while(rp!=r)rp++,mod(rp-R[rp]+1,M-g[rp+1]); calcg(l,mid); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; calcf(1,n); for(int i=1;i<=n;i++){ memset(g,0,sizeof(g)); int x=a[i]; a[i]=1; g[n+1]=1; calcg(1,n); // for(int i=1;i<=n;i++) // cout<<g[i]<<" "; // cout<<endl; a[i]=x; cout<<g[1]<<" "; } cout<<endl; for(int i=1;i<=n;i++) p[i]=f[i-1],q[i]=g[i+1]; cout.flush(); return 0; }


测评信息: