제출 #858845

#제출 시각아이디문제언어결과실행 시간메모리
858845willychanMisspelling (JOI22_misspelling)C++14
100 / 100
712 ms150104 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; //#include<bits/extc++.h> //__gnu_pbds const int MOD = 1000000007; const int N = 5e5+5; ll dp[N][26]; priority_queue<int,vector<int>,greater<int> > belongs[4]; ll re[4][26]; void remove(int v,int k){ //cerr<<"removing "<<v<<" from "<<k<<"\n"; for(int c=0;c<26;c++){ re[k][c]-=dp[v][c]; re[k][c]%=MOD; } } void add(int v,int k){ //cerr<<"adding "<<v<<" to "<<k<<"\n"; for(int c=0;c<26;c++){ re[k][c]+=dp[v][c]; re[k][c]%=MOD; //cout<<re[k][c]<<" "; } //cout<<"\n"; } vector<int> ran[N][2]; void printbelongs(){ cout<<"--------------------\n"; cout<<"printing...:\n"; for(int k=0;k<4;k++){ priority_queue<int,vector<int>,greater<int> > cloneb = belongs[k]; while(cloneb.size()) {cout<<cloneb.top()<<" ";cloneb.pop();} cout<<"\n"; } cout<<"--------------------\n"; } void mantain(int r,bool t){ if(!t){ while(belongs[0].size() && belongs[0].top()<=r){ belongs[2].push(belongs[0].top()); remove(belongs[0].top(),0); add(belongs[0].top(),2); belongs[0].pop(); } while(belongs[1].size() && belongs[1].top()<=r){ belongs[3].push(belongs[1].top()); remove(belongs[1].top(),1); add(belongs[1].top(),3); belongs[1].pop(); } }else{ while(belongs[0].size() && belongs[0].top()<=r){ belongs[1].push(belongs[0].top()); remove(belongs[0].top(),0); add(belongs[0].top(),1); belongs[0].pop(); } while(belongs[2].size() && belongs[2].top()<=r){ belongs[3].push(belongs[2].top()); remove(belongs[2].top(),2); add(belongs[2].top(),3); belongs[2].pop(); } } } ll getrange(int l,int r,int k){ if(l>r) return 0; ll result = re[k][r]; if(l) result = (result-re[k][l-1])%MOD; return result; } int main(){ ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0); int n,m;cin>>n>>m; for(int i=0;i<m;i++){ int a,b;cin>>a>>b; bool w= 0; if(a>b){w=1;swap(a,b);} ran[a+1][w].push_back(b); } for(int i=n;i>=1;i--){ belongs[0].push(i); for(int c=1;c<26;c++){ for(int k=0;k<4;k++){ re[k][c]=(re[k][c]+re[k][c-1])%MOD; } } for(int c=0;c<26;c++){ if(i==n) dp[i][c]=1; else{ for(int k=0;k<4;k++){ if(k==0) dp[i][c]+=(getrange(0,c-1,k)+getrange(c+1,25,k))%MOD; if(k==1) dp[i][c]+=getrange(0,c-1,k); if(k==2) dp[i][c]+=getrange(c+1,25,k); dp[i][c]%=MOD; } dp[i][c]++; dp[i][c]%=MOD; } // cout<<dp[i][c]<<" "; } for(int c=25;c>=1;c--){ for(int k=0;k<4;k++){ re[k][c] = (re[k][c]-re[k][c-1])%MOD; } } //cout<<"\n"; for(int k=0;k<4;k++) if(belongs[k].size() && belongs[k].top()==i) add(i,k); for(int b=0;b<2;b++){for(auto v : ran[i][b]) mantain(v,b);} /* cout<<"k:"; for(int k=0;k<4;k++){ for(int c=0;c<26;c++){ cout<<re[k][c]<<" "; } cout<<"\n"; } printbelongs(); */ } ll ans = 0; for(int i=0;i<26;i++) ans=(ans+dp[1][i])%MOD; if(ans<0) ans+=MOD; cout<<ans<<"\n"; return 0; } // abba works... /* 4 3 2 3 3 1 1 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...