Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
29377 baka24 【BJ】T3 C++ 运行超时 70 1000 MS 2564 KB 3624 2024-05-06 21:12:24

Tests(7/10):


#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=410,N=410,inf=1000000000,Mod=1000000007; int n,l,r,m,ans,a[MAXN],p[N],id[N],s[N],bel[N],use[MAXN],k,c[N],us[N]; int C[MAXN]; int lb(int x){return x&(-x);} void clear(){memset(C,0,sizeof(C));} int qry(int x){int res=0;for(int i=x;i;i-=lb(i))res+=C[i];return res;} void upd(int x,int y){for(int i=x;i<=n;i+=lb(i))C[i]+=y;} int ans0[MAXN*MAXN],ans1[MAXN*MAXN]; void dfs0(int now){ if(now==k+1){ int sum=0; for(int i=id[k+1]-1;i;i--){ sum+=qry(a[i]); upd(a[i],1); } for(int i=id[k+1]-1;i;i--){ upd(a[i],-1); } ans0[sum]++; return; } for(int i=1;i<=k;i++){ if(!us[i]){ us[i]=1; a[id[now]]=s[i]; dfs0(now+1); a[id[now]]=0; us[i]=0; } } } void getans0(){ k=0; for(int i=1;i<=m;i++){ if(!bel[i])s[++k]=p[i]; } dfs0(1); } void dfs1(int now){ if(now==k+1){ int sum=0; for(int i=n;i>=id[m-k+1];i--){ sum+=qry(a[i]); upd(a[i],1); } for(int i=n;i>=id[m-k+1];i--){ upd(a[i],-1); } ans1[sum]++; return; } for(int i=1;i<=k;i++){ if(!us[i]){ us[i]=1; a[id[m-now+1]]=s[i]; dfs1(now+1); a[id[m-now+1]]=0; us[i]=0; } } } void getans1(){ k=0; for(int i=1;i<=m;i++){ if(bel[i])s[++k]=p[i]; } dfs1(1); } int getjz(int x,int y){ int res=0; k=0; for(int i=1;i<=m;i++){ if(bel[i])upd(p[i],1); } for(int i=id[x+1];i<=n;i++){ if(a[i])upd(a[i],1); } for(int i=1;i<=m;i++){ if(!bel[i])res+=qry(p[i]); } for(int i=1;i<id[x+1];i++){ if(a[i])res+=qry(a[i]); } clear(); // cout<<"R:"<<res<<endl; return res; } void dfs(int now,int sum0,int sum1){ if(now==m+1){ // for(int i=1;i<=m;i++)cout<<bel[i]<<" ";cout<<endl; int tmp=getjz(sum0,sum1); l-=tmp;r-=tmp; // cout<<tmp<<endl; getans0(); getans1(); for(int i=0;i<=n*(n-1)/2;i++){ // cout<<ans0[i]<<" "; if(i)ans0[i]+=ans0[i-1]; } // cout<<endl; // for(int i=0;i<=n*(n-1)/2;i++){ // cout<<ans1[i]<<" "; // }cout<<endl; // cout<<l<<" "<<r<<":"<<endl; for(int i=0;i<=n*(n-1)/2;i++){ ans+=((r-i>0?ans0[r-i]:0)-(l-i-1>0?ans0[l-i-1]:0))*ans1[i]%Mod,ans%=Mod; // cout<<" "<<r-i<<" "<<l-i-1<<" "<<(r-i>0?ans0[r-i]:0)<<" "<<(l-i-1>0?ans0[l-i-1]:0)<<" "<<ans1[i]<<endl; } for(int i=0;i<=n*(n-1)/2;i++){ ans0[i]=ans1[i]=0; } l+=tmp,r+=tmp; return; } if(sum0>=m/2){ bel[now]=1; dfs(now+1,sum0,sum1+1); return; } if(sum1>=m-m/2){ bel[now]=0; dfs(now+1,sum0+1,sum1); return; } bel[now]=0; dfs(now+1,sum0+1,sum1); bel[now]=1; dfs(now+1,sum0,sum1+1); } void slv(){ scanf("%lld%lld%lld",&n,&l,&r); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); use[a[i]]=1; if(!a[i])id[++m]=i; }m=0; for(int i=1;i<=n;i++){ if(!use[i])p[++m]=i; } dfs(1,0,0); printf("%lld",ans%Mod); } signed main(){ slv(); return 0; }


测评信息: