제출 #365182

#제출 시각아이디문제언어결과실행 시간메모리
365182kshitij_sodaniŽarulje (COI15_zarulje)C++14
60 / 100
1059 ms7916 KiB
//#pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long llo; #define mp make_pair #define pb push_back #define a first #define b second #define endl '\n' llo n,k; llo mod=1e9+7; llo it[200001]; llo dp[2001][2001]; int le[200001]; int re[200001]; llo ee(llo aa,llo bb){ if(bb==0){ return 1; } llo ac=ee(aa,bb/2); ac=(ac*ac)%mod; if(bb%2==1){ ac=(ac*aa)%mod; } return ac; } llo fac[1000001]; llo fac2[1000001]; llo cal(llo aa,llo bb){ llo cur=(fac[aa]*fac2[aa-bb])%mod; cur=(cur*fac2[bb])%mod; return cur; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>k; for(llo i=0;i<n;i++){ cin>>it[i]; } fac[0]=1; for(llo i=1;i<=n;i++){ fac[i]=(fac[i-1]*i)%mod; //cout<<fac[i]<<":"; } // cout<<endl; for(llo i=n;i<=n;i++){ fac2[i]=ee(fac[i],mod-2); //cout<<fac2[i]<<":"; } for(llo i=n-1;i>=0;i--){ fac2[i]=(fac2[i+1]*(i+1))%mod; } vector<pair<int,int>> ss; for(int i=0;i<n;i++){ while(ss.size()){ if(ss.back().a>it[i]){ ss.pop_back(); } else{ break; } } le[i]=-1; if(ss.size()){ le[i]=ss.back().b; } ss.pb({it[i],i}); } ss.clear(); for(int i=n-1;i>=0;i--){ while(ss.size()){ if(ss.back().a>it[i]){ ss.pop_back(); } else{ break; } } re[i]=-1; if(ss.size()){ re[i]=ss.back().b; } ss.pb({it[i],i}); } /* for(llo i=0;i<n;i++){ cin>>it[i]; } dp[0][n-1]=1; for(llo i=n-2;i>=0;i--){ for(llo j=0;j+i<n;j++){ dp[j][j+i]=0; llo x=0; if(j>0){ x=max(x,it[j-1]); } if(j+i+1<n){ x=max(x,it[j+i+1]); } if(j>0){ if(it[j-1]==x){ dp[j][j+i]+=dp[j-1][j+i]; } } if(j+i+1<n){ if(it[j+i+1]==x){ dp[j][j+i]+=dp[j][j+i+1]; } } dp[j][j+i]%=mod; } }*/ //vector<llo> ss; for(llo i=0;i<k;i++){ llo aa; cin>>aa; aa--; // ss.pb(aa-1); map<int,pair<int,int>> tt; int cur=aa-1; while(cur>=0 and cur<n){ if(tt.find(it[cur])!=tt.end()){ tt[it[cur]].a++; } else{ tt[it[cur]]={1,0}; } //cout<<cur<<",,"; cur=le[cur]; } //cout<<endl; cur=aa+1; while(cur>=0 and cur<n){ if(tt.find(it[cur])!=tt.end()){ tt[it[cur]].b++; } else{ tt[it[cur]]={0,1}; } //cout<<cur<<",,"; cur=re[cur]; } //cout<<endl; int ans=1; for(auto j:tt){ ans=(ans*cal(j.b.a+j.b.b,j.b.a))%mod; // cout<<j.a<<":"<<j.b.a<<":"<<j.b.b<<endl; } cout<<ans<<endl; } /*for(auto j:ss){ //cout<<dp[j][j]<<endl; map<int,int> } */ return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...