神仙题.
代码:
#include <cstdio> #include <vector> #include <cstring> #include <algorithm> #define N 2000004 #define ll long long #define mod 998244353 #define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; int n,ans; int q[N],b[N],c[N],inv[N],fac[N]; inline int ADD(int x,int y) { return (x+y)>=mod?x+y-mod:x+y; } inline int C(int x,int y) { return (ll)fac[x]*inv[y]%mod*inv[x-y]%mod; } inline int GE(int x,int y) { //if(y==0) return 1; //if(y==1) return x; return ADD(C(x+y,x),mod-C(x+y,x+1)); } void init() { fac[0]=1; for(int i=1;i<N;++i) fac[i]=(ll)fac[i-1]*i%mod; inv[1]=1; for(int i=2;i<N;++i) inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod; inv[0]=1; for(int i=1;i<N;++i) inv[i]=(ll)inv[i-1]*inv[i]%mod; } struct BIT { int sum[N]; inline int lowbit(int x) { return x&(-x); } void upd(int x) { while(x<N) ++sum[x],x+=lowbit(x); } int query(int x) { int re=0; for(;x;x-=lowbit(x)) { re+=sum[x]; } return re; } void clr() { memset(sum,0,sizeof(sum)); } }op; void solve() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&q[i]); for(int i=n;i>=1;--i) { b[i]=n-i-op.query(q[i]); op.upd(q[i]); // 前面小于我的=i-1-前面大于我的 c[i]=i-1-(n-q[i]-b[i]); } op.clr(); ans=0; int nw=n; for(int i=1;i<=n;++i) { bool flag=(b[i]<nw); nw=min(nw,b[i]); if(nw<=0) break; ans=ADD(ans,GE(n-i+1,nw-1)); if(!flag&&c[i]!=q[i]-1) break; } printf("%d\n",ans); } int main() { //setIO("inverse"); int T,x,y,z; init(); scanf("%d",&T); while(T--) { solve(); } return 0; }