Submission #1178333

#TimeUsernameProblemLanguageResultExecution timeMemory
1178333ace5Misspelling (JOI22_misspelling)C++20
100 / 100
283 ms247088 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 500005; const int mod = 1000000007; const int maxlog = 19; const int alf = 26; int add(int a,int b) { return a+b >= mod ? a+b-mod : a+b; } vector<pair<int,int>> st1,stn; int dp[2][alf][maxn],pref[alf+1][maxn],suf[alf+1][maxn]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n,m; cin >> n >> m; vector<vector<int>> r1(n),rn(n); for(int i = 0;i < m;++i) { int a,b; cin >> a >> b; a--; b--; if(a < b) { rn[a].push_back(b-1); } else { r1[b].push_back(a-1); } } int maxr1[n],maxrn[n]; for(int j = n-1;j >= 0;--j) { int rg = j-1; for(int u = 0;u < rn[j].size();++u) { rg = max(rg,rn[j][u]); } while(st1.size() && st1.back().first <= rg+1) { rg = max(rg,st1.back().second); st1.pop_back(); } maxr1[j] = rg+1; if(rg >= j) st1.push_back({j,rg}); rg = j-1; for(int u = 0;u < r1[j].size();++u) { rg = max(rg,r1[j][u]); } while(stn.size() && stn.back().first <= rg+1) { rg = max(rg,stn.back().second); stn.pop_back(); } maxrn[j] = rg+1; if(rg >= j) stn.push_back({j,rg}); } for(int j = n-1;j >= 0;--j) { for(int c = 0;c < alf;++c) { if(j == n-1) { dp[0][c][j] = 0; dp[1][c][j] = 0; } else { if(maxr1[j] != j) { dp[1][c][j] = dp[1][c][maxr1[j]]; } else { dp[1][c][j] = add(dp[1][c][j+1],suf[c+1][j+1]); } if(maxrn[j] != j) { dp[0][c][j] = dp[0][c][maxrn[j]]; } else { dp[0][c][j] = add(dp[0][c][j+1],pref[c][j+1]); } } pref[c+1][j] = add(pref[c][j],add(dp[0][c][j],dp[1][c][j]+1)); } for(int c = alf-1;c >= 0;--c) { suf[c][j] = add(suf[c+1][j],add(dp[0][c][j],dp[1][c][j]+1)); } } cout << pref[alf][0]; return 0; }
#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...