제출 #1304841

#제출 시각아이디문제언어결과실행 시간메모리
1304841BilAktauAlmansurCrossing (JOI21_crossing)C++20
0 / 100
44 ms828 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define fi first #define se second const int N = 2e5 + 7, M = 5e6 + 7, mod = 1e9 + 9; int n, m, pw[N], tr[4 * N], add[4 * N]; string merge(string x, string y) { string res = ""; for(int i = 0; i < n; i++) { if(x[i] == y[i])res += x[i]; else { if(x[i] == 'J' && y[i] == 'O')res += 'I'; if(x[i] == 'O' && y[i] == 'J')res += 'I'; if(x[i] == 'I' && y[i] == 'O')res += 'J'; if(x[i] == 'O' && y[i] == 'I')res += 'J'; if(x[i] == 'J' && y[i] == 'I')res += 'O'; if(x[i] == 'I' && y[i] == 'J')res += 'O'; } } return res; } string t[9]; string s; void build(int v, int lx, int rx) { if(lx == rx) { tr[v] = ((s[lx - 1] - '0' + 1) * lx) % mod; return; } int m = (lx + rx) >> 1; build(v + v, lx, m); build(v + v + 1, m + 1, rx); tr[v] = (tr[v + v] + tr[v + v + 1]) % mod; } int calc(int l, int r) { return (pw[r] - pw[l - 1] + mod) % mod; } void push(int v, int lx, int rx) { if(!add[v])return; if(lx != rx) { add[v + v] = add[v]; add[v + v + 1] = add[v]; } tr[v] = (add[v] * calc(lx, rx)) % mod; add[v] = 0; } void upd(int l, int r, int c, int v, int lx, int rx) { push(v, lx, rx); if(lx > r || l > rx)return; if(lx >= l && r >= rx) { add[v] = c; push(v, lx, rx); return; } int m = (lx + rx) >> 1; upd(l, r, c, v + v, lx, m); upd(l, r, c, v + v + 1, m + 1, rx); tr[v] = (tr[v + v] + tr[v + v + 1]) % mod; } int get(int l, int r, int v, int lx, int rx) { push(v, lx, rx); if(lx > r || l > rx)return 0; if(lx >= l && r >= rx)return tr[v]; int m = (lx + rx) >> 1; return (get(l, r, v + v, lx, m) + get(l, r, v + v + 1, m + 1, rx)) % mod; } void solve() { cin>>n; pw[0] = 0; for(int i = 1; i <= n; i++) { pw[i] = (pw[i - 1] + i) % mod; } cin>>t[0]>>t[1]>>t[2]; t[3] = merge(t[0], t[1]); t[4] = merge(t[0], t[2]); t[5] = merge(t[1], t[2]); t[6] = merge(t[0], t[5]); t[7] = merge(t[1], t[4]); t[8] = merge(t[2], t[3]); map<int, int> mp; for(int i = 0; i < 9; i++) { int sum = 0; for(int j = 1; j <= n; j++) { sum = (sum + ((t[i][j - 1] - '0' + 1) * j) % mod) % mod; } mp[sum] = 1; } int q; cin>>q; cin>>s; build(1, 1, n); int s = get(1, n, 1, 1, n); if(mp.count(s))cout << "Yes\n"; else cout << "No\n"; while(q --) { int l, r; char c; cin>>l>>r>>c; upd(l, r, (c - '0' + 1), 1, 1, n); s = get(1, n, 1, 1, n); if(mp.count(s))cout << "Yes\n"; else cout << "No\n"; } } signed main() { ios_base::sync_with_stdio(NULL); cin.tie(NULL); int T = 1; // cin>>T; while(T --)solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...