Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
29383 | 张老师 | 【BJ】T3 | C++ | 通过 | 100 | 575 MS | 225384 KB | 2211 | 2024-05-06 21:25:15 |
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; #define inc(a,b) {a+=b;if (a>=mo) a-=mo;} #define dec(a,b) {a-=b;if (a<0) a+=mo;} #define lb(x) ((x)&(-(x))) const int maxn=510; const int maxm=15; const int maxs=1<<14; const int maxq=3500; const int mo=1000000007; int n,m,z[maxn],y[maxm],num[maxm][maxm],L,R,ans; int sum[maxs][maxq],incre[maxs],remap[maxs],incre2[maxm][maxs]; bool show[maxn]; void dfs1(int p,int up,int nows,int delta) { if (p>up) { sum[nows][delta]++; return; } int cs=((1<<m)-1)^nows,a,b; for (;cs;) { b=lb(cs); a=remap[b]; dfs1(p+1,up,nows|(1<<a),delta+incre2[a][nows]+num[p][a]); cs-=b; } } void dfs2(int p,int up,int nows,int delta) { if (p>up) { int s=((1<<m)-1)^nows; delta+=incre[nows]; int r=R-delta; int l=L-delta; if (r>=0) { inc(ans,sum[s][r]); if (l>0) dec(ans,sum[s][l-1]); } return; } int cs=((1<<m)-1)^nows,a,b; for (;cs;) { b=lb(cs); a=remap[b]; dfs2(p+1,up,nows|(1<<a),delta+incre2[a][nows]+num[p][a]); cs-=b; } } int main() { scanf("%d%d%d",&n,&L,&R); for (int a=1;a<=n;a++) { scanf("%d",&z[a]); show[z[a]]=true; } for (int a=1;a<=n;a++) if (z[a]) for (int b=a+1;b<=n;b++) if (z[b] && z[a]>z[b]) L--,R--; if (R<0) { printf("0\n"); return 0; } for (int a=1;a<=n;a++) if (!show[a]) y[m++]=a; int cnt=0; for (int a=1;a<=n;a++) if (!z[a]) { for (int b=0;b<m;b++) { for (int c=1;c<a;c++) if (z[c] && z[c]>y[b]) num[cnt][b]++; for (int c=a+1;c<=n;c++) if (z[c] && y[b]>z[c]) num[cnt][b]++; } cnt++; } for (int a=0;a<(1<<m);a++) for (int b=0;b<m;b++) if (a&(1<<b)) for (int c=0;c<m;c++) if (!(a&(1<<c))) if (y[b]>y[c]) incre[a]++; for (int a=0;a<(1<<m);a++) for (int b=0;b<m;b++) for (int c=0;c<m;c++) if (a&(1<<c)) if (y[c]>y[b]) incre2[b][a]++; for (int a=0;a<m;a++) remap[1<<a]=a; int half=m/2; dfs1(half,m-1,0,0); for (int a=0;a<(1<<m);a++) for (int b=1;b<maxq;b++) sum[a][b]+=sum[a][b-1]; dfs2(0,half-1,0,0); printf("%d\n",ans); return 0; }