제출 #892338

#제출 시각아이디문제언어결과실행 시간메모리
892338dimashhhMisspelling (JOI22_misspelling)C++17
100 / 100
310 ms144720 KiB
#include <bits/stdc++.h> using namespace std; const int N = 5e5 + 1, MOD = 1e9 + 7; typedef long long ll; int n,m,mx_x[N],mx_y[N]; ll dp[N][26],sum[26],ss[26]; set<int> st,st1; void test(){ cin >> n >> m; for(int i = 1;i <= m;i++){ int a,b; cin >> a >> b; if(a < b){ mx_x[a + 1] = max(mx_x[a + 1],b); }else{ mx_y[b + 1] = max(mx_y[b + 1],a); } } for(int i = 0;i < 26;i++){ dp[n][i] = 1; sum[i] = ss[i] = 1; } st.insert(n); st1.insert(n); for(int i = n - 1;i >= 1;i--){ if(mx_y[i + 1] >= i + 1){ while(!st.empty()){ auto it = st.lower_bound(i + 1); if(it != st.end() && (*it) <= mx_y[i + 1]){ for(int c = 0;c < 26;c++){ sum[c] = (sum[c] - dp[*it][c]); if(sum[c] < 0) sum[c] += MOD; } st.erase(it); }else break; } } if(mx_x[i + 1] >= i + 1){ while(!st1.empty()){ auto it = st1.lower_bound(i + 1); if(it != st.end() && (*it) <= mx_x[i + 1]){ for(int c = 0;c < 26;c++){ ss[c] = (ss[c] - dp[*it][c]); if(ss[c] < 0) ss[c] += MOD; } st1.erase(it); }else break; } } for(int c =0 ;c < 26;c++){ dp[i][c] = 1; } ll f = 0; for(int c = 1;c < 26;c++){ f += sum[c - 1]; if(f >= MOD) f -= MOD; dp[i][c] += f; if(dp[i][c] >= MOD) dp[i][c] -= MOD; } f = 0; for(int c = 25;c >=0;c--){ f += ss[c + 1]; if(f >= MOD) f -= MOD; dp[i][c] += f; if(dp[i][c] >= MOD) dp[i][c] -= MOD; } // for(int c = 0;c < 26;c++){ // dp[i][c] = 1; // int x = 0,y = 0; // for(int j = i + 1;j <= n;j++){ // x = max(x,mx_x[j]); // y = max(y,mx_y[j]); // for(int d = 0;d < 26;d++){ // if(d == c) continue; // bool ok = false; // if(d > c){ // if(x < j){ // ok = 1; // } // }else{ // if(y < j){ // ok = 1; // } // } // if(ok){ // dp[i][c] += dp[j][d]; // ss[i] += dp[j][d]; // if(dp[i][c] >= MOD) dp[i][c] -= MOD; // if(ss[i] >= MOD) ss[i] -= MOD; // } // } // } // } st.insert(i); st1.insert(i); for(int c = 0;c < 26;c++){ sum[c] += dp[i][c]; if(sum[c] >= MOD) sum[c] -= MOD; ss[c] += dp[i][c]; if(ss[c] >= MOD) ss[c] -= MOD; } } int ans = 0; for(int i = 0;i < 26;i++){ ans += dp[1][i]; if(ans>= MOD) ans -= MOD; } cout << ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int T = 1; // cin >> T; while (T--) test(); }
#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...