提交时间:2024-10-20 16:57:34

运行 ID: 33741

#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){ int mid=(l+r-1)>>1; R[mid+1]=a[mid+1]; L[mid+1]=-1e9; for(int i=mid;i>=l;i--)L[i]=max(L[i+1],a[i]); for(int i=mid+1;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+1; int s=f[mid]; cout.flush(); 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--; add(f[ri],s+gt(ri+1)); } while(lp!=l)lp--,mod(L[lp]+lp,M-f[lp-1]); if(l==r)return ; calcf(l,mid),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)); f[0]=1,g[n+1]=1; calcf(1,n); for(int i=1;i<=n;i++) cout<<f[i]<<" "; cout<<endl; } for(int i=1;i<=n;i++) p[i]=f[i-1],q[i]=g[i+1]; cout.flush(); return 0; }