提交时间:2024-05-06 17:12:52
运行 ID: 29336
#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,L,R,P[maxn],used[maxn],id[maxn],PPC[maxn],POS[maxn]; vector<int>pos,S; vector<int>g[233]; int head[2][3500],nxt[2][3500]; vector<pi>INS[2][3500]; vector<pi>dp[2][3500]; int sum[20000][505],ww[20][505],rk[20][20000]; 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; int ppc(int x){ int res=0;for(;x;res+=(x&1),x>>=1);return res; } inline int calc(int l,int r,int S){ if(l>r)return 0; return sum[S][r]-sum[S][l-1]; } void slv(){ n=read(),L=read(),R=read();up(i,1,n)P[i]=read(),used[P[i]]=i; up(i,1,n)if(!used[i])S.p_b(i); pos.p_b(0); up(i,1,n)if(!P[i])pos.p_b(i);int m=int(pos.size())-1;pos.p_b(n+1); up(i,0,(1<<m)-1)PPC[i]=ppc(i),g[PPC[i]].p_b(i),id[i]=g[PPC[i]].size(); 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]); } } int ct=0; up(i,1,pos[1]-1)T.upd(P[i],1),ct+=i-T.qry(P[i]); dp[0][1].p_b(m_p(ct,1)); int op=0; up(i,1,m){ op^=1; if(i>1){ for(int x:g[i-2])dp[op][id[x]].clear(),INS[op][id[x]].clear(); } for(int x:g[i-1]){ for(auto it:INS[!op][id[x]]){ if(!POS[it.p1]){ dp[!op][id[x]].p_b(it); POS[it.p1]=dp[!op][id[x]].size()-1; }else { (dp[!op][id[x]][POS[it.p1]].p2+=it.p2)%=mod; } }for(auto it:INS[!op][id[x]])POS[it.p1]=0; } for(int x:g[i-1]){ vector<int>qwq; down(j,m-1,0)if(!((x>>j)&1))qwq.p_b(j); for(int y:qwq){ for(auto it:dp[!op][id[x]]){ int nxt=x^(1<<y); INS[op][id[nxt]].p_b(m_p(it.p1+calc(pos[i]+1,pos[i+1]-1,nxt)+ww[y][pos[i]]+rk[y][x],it.p2)); } } } } int res=0; for(auto it:INS[op][1])if(it.p1>=L&&it.p1<=R)(res+=it.p2)%=mod; cout<<res; }int main(){ // freopen("c.in","r",stdin); // freopen("c.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; fclose(stdin); fclose(stdout); return 0; }