Submission #586855

#TimeUsernameProblemLanguageResultExecution timeMemory
586855penguinhackerMisspelling (JOI22_misspelling)C++17
100 / 100
1713 ms222960 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ar array const int mxN=5e5, M=1e9+7, INF=69696969; int n, m, first[mxN][2], dp[mxN][2][26], pbad[mxN+1][2], base[mxN][26]; vector<int> bad[mxN][2]; struct ST { int st[1<<20], lz[1<<20]; void psh(int u, int l, int r) { if (lz[u]) { st[u]+=lz[u]; if (l!=r) lz[2*u]+=lz[u], lz[2*u+1]+=lz[u]; lz[u]=0; } } void upd(int ql, int qr, int x, int u=1, int l=0, int r=n-1) { psh(u, l, r); if (l>qr||r<ql) return; if (ql<=l&&r<=qr) { lz[u]=x; psh(u, l, r); return; } int mid=(l+r)/2; upd(ql, qr, x, 2*u, l, mid); upd(ql, qr, x, 2*u+1, mid+1, r); st[u]=min(st[2*u], st[2*u+1]); } int qry(int u=1, int l=0, int r=n-1) { psh(u, l, r); if (st[u]>0) return -1; if (l==r) return l; int mid=(l+r)/2; int ls=qry(2*u, l, mid); return ls!=-1?ls:qry(2*u+1, mid+1, r); } } st[2]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for (int i=0; i<m; ++i) { int a, b; cin >> a >> b, --a, --b; if (a<b) { ++a; bad[a][0].push_back(b); st[0].upd(a, b, 1); ++pbad[a][0], --pbad[b+1][0]; } else { swap(a, b); ++a; bad[a][1].push_back(b); st[1].upd(a, b, 1); ++pbad[a][1], --pbad[b+1][1]; } } for (int i=1; i<n; ++i) { for (int j : {0, 1}) pbad[i][j]+=pbad[i-1][j]; for (int j=0; j<26; ++j) base[i][j]=(!pbad[i][0]?j:0)+(!pbad[i][1]?25-j:0); } memset(first, -1, sizeof(first)); ll ans=26; for (int i=0; i<n; ++i) { //ar<ll, 26> cur; //cur.fill(1); ar<ll, 26> cur; for (int j=0; j<26; ++j) cur[j]=base[i][j]; for (int j : {0, 1}) if (first[i][j]!=-1) for (int k=0; k<26; ++k) cur[k]=(cur[k]+dp[i][j][k]-dp[first[i][j]][j][k]+M)%M; for (int j : {0, 1}) { for (int k : bad[i][j]) st[j].upd(i, k, -1); for (int pos=st[j].qry(); pos!=-1; pos=st[j].qry()) { st[j].upd(pos, pos, INF); first[pos][j]=i; } } //if (i==n-1) for (int j=0; j<26; ++j) ans=(ans+cur[j])%M; int ic=0; for (int j=0; j<26; ++j) { dp[i+1][0][j]=(dp[i][0][j]+ic)%M; ic=(ic+cur[j])%M; } int dc=0; for (int j=25; ~j; --j) { dp[i+1][1][j]=(dp[i][1][j]+dc)%M; dc=(dc+cur[j])%M; } } cout << ans; 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...