提交时间:2024-10-20 19:53:39

运行 ID: 33743

#include<bits/stdc++.h> using namespace std; #define int long long int f[200300],g[200300]; int p[200300],q[200300]; int n,a[200300]; int L[200300],R[200300]; int t[200300]; 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]); int p=mid; 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--; if(ri==5){ // cout<<l<<" "<<r<<" "<<lp<<" "<<rp<<" "<<R[ri]<<" "<<s<<endl; } add(f[ri],s+gt(ri+1)); } while(lp!=l)lp--,mod(L[lp]+lp,M-f[lp-1]); // 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("genshin.in","r",stdin); // freopen("genshin.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)); 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]<<" "; } for(int i=1;i<=n;i++) p[i]=f[i-1],q[i]=g[i+1]; cout.flush(); return 0; }