Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
29403 | LYLAKIOI | 【BJ】T3 | C++ | 运行超时 | 90 | 1000 MS | 175768 KB | 4418 | 2024-05-06 22:14:32 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define m_p make_pair #define pi pair<int,int> #define p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,m,L,R; short P[maxn],used[maxn],nxt[maxn]; short POS[maxn],S[maxn]; short id[maxn],id2[maxn],tp1[maxn],tp2[maxn],C1,C2; int mp[3500][5300],mp2[3500][5300]; int sum[20000][505]; short ww[20][505],rk[20][20000]; short GAK[maxn],GAK2[maxn]; short RK[maxn]; int SUM[int(2e5)+10]; struct BIT { int t[505]; void cl(){memset(t,0,sizeof(t));} int lb(int x){return x&(-x);} void upd(int x,int v){for(;x<=n;x+=lb(x))t[x]+=v;} int qry(int x){int res=0;for(;x;x-=lb(x))res+=t[x];return res;} }T; inline int calc(int l,int r,int S){ if(l>r)return 0; return sum[S][r]-sum[S][l-1]; } int ppc(int x){int res=0;while(x)res+=x&1,x>>=1;return res;} int TIM; int SSUUMM[maxn]; void dfs(int x,int pos,short st,int now){ if(x>m/2){ mp[id[st]][++tp1[id[st]]]=now;return; } for(int y=nxt[0],lst=0;y;lst=y,y=nxt[y]){ nxt[lst]=nxt[y]; short ii=RK[y]; dfs(x+1,POS[x+1],st|(1<<ii),now+calc(POS[x]+1,POS[x+1]-1,st|(1<<ii))+ww[ii][POS[x]]+rk[ii][st]); nxt[lst]=y; } } int LST; void dfs2(int x,int pos,short st,int now){ if(pos>n){ mp2[id2[st]][++tp2[id2[st]]]=now;return; }if(P[pos]){dfs2(x,pos+1,st,now);return;} for(int y=nxt[0],lst=0;y;lst=y,y=nxt[y]){ nxt[lst]=nxt[y]; short ii=RK[y]; dfs2(x+1,POS[x+1],st|(1<<ii),now+calc(POS[x]+1,POS[x+1]-1,st|(1<<ii))+ww[ii][POS[x]]-ww[ii][LST]+rk[ii][st]); nxt[lst]=y; } } int calc(int St){ up(i,1,n)SSUUMM[i]=0; int res=0,ct=0; up(i,1,POS[m/2+1]-1)if(P[i])SSUUMM[P[i]]++,ct++; down(i,m-1,0)if((St>>i)&1)SSUUMM[S[i]]++,ct++; up(i,1,n)SSUUMM[i]+=SSUUMM[i-1]; up(i,POS[m/2+1],n)if(P[i])res+=ct-SSUUMM[P[i]]; down(i,m-1,0)if(!((St>>i)&1))res+=ct-SSUUMM[S[i]]; return res; } ll sol(int l,int r){ ll res=0; int S=(1<<m)-1; up(i,1,C1){ int val=calc(GAK[i]); int jk=id2[S^GAK[i]]; int mx=0; up(j,1,tp1[i])mx=max(mx,r-mp[i][j]-val); memset(SUM,0,sizeof(int)*(mx+5)); up(j,1,tp2[jk])SUM[mp2[jk][j]]++; up(j,1,mx)SUM[j]+=SUM[j-1]; up(j,1,tp1[i]){ int jk=id2[S^GAK[i]]; if(r<mp[i][j]+val)continue; res+=SUM[r-mp[i][j]-val]; if(l-1-mp[i][j]-val>=0)res-=SUM[l-1-mp[i][j]-val]; } } return res%mod; } void slv(){ n=read(),L=read(),R=read();up(i,1,n)P[i]=read(),used[P[i]]=1; int gczakioi=0,gak=0; int gg=0; ;up(i,1,n)if(!P[i])POS[++gg]=i;POS[++gg]=n+1;gg=0; up(i,1,n)if(!used[i])nxt[gczakioi]=i,RK[i]=gak++,S[gg++]=i,++m,gczakioi=i; up(i,0,(1<<m)-1){ if(ppc(i)==m/2)id[i]=++C1,GAK[C1]=i; if(ppc(i)==m-m/2)id2[i]=++C2,GAK2[C2]=i; } up(i,0,(1<<m)-1){int ct=0; down(j,m-1,0)rk[j][i]=ct,ct+=((i>>j)&1); } up(i,0,(1<<m)-1){T.cl(); int ct=0; up(j,1,n){ sum[i][j]=sum[i][j-1]; if(P[j]){ up(k,0,m-1)if((i>>k)&1)sum[i][j]+=(P[j]<S[k]); } if(P[j])++ct,T.upd(P[j],1),sum[i][j]+=ct-T.qry(P[j]); } }T.cl(); up(i,1,n){ up(j,0,m-1){ ww[j][i]=ww[j][i-1]+(P[i]>S[j]); } } T.cl(); int now=0;up(i,1,POS[1]-1)T.upd(P[i],1),now+=i-T.qry(P[i]); dfs(1,POS[1],0,now);LST=POS[m/2+1]-1; up(i,0,(1<<m)-1){T.cl(); int ct=0; sum[i][LST]=0; up(j,LST+1,n){ sum[i][j]=sum[i][j-1]; if(P[j]){ up(k,0,m-1)if((i>>k)&1)sum[i][j]+=(P[j]<S[k]); } if(P[j])++ct,T.upd(P[j],1),sum[i][j]+=ct-T.qry(P[j]); } }dfs2(m/2+1,POS[m/2+1],0,0); ll res=sol(L,R); cout<<res; }int main(){ // freopen("c.in","r",stdin); // freopen("c.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }