Submission #1192110

#TimeUsernameProblemLanguageResultExecution timeMemory
1192110Kel_MahmutCrossing (JOI21_crossing)C++20
0 / 100
270 ms3324 KiB
#include<bits/stdc++.h> #define pb push_back #define all(aa) aa.begin(), aa.end() #define endl ("\n") typedef long long ll; using namespace std; int main(){ int n, q; string A, B, C, T; cin >> n >> A >> B >> C; cin >> q >> T; vector<array<int, 3>> u(q); for(int i = 0; i < q; i++){ char c; cin >> u[i][0] >> u[i][1] >> c; u[i][0]--; u[i][1]--; u[i][2] = (c == 'J' ? 0 : (c == 'O' ? 1 : 2)); } auto to_int = [&](string & x){ vector<int> ret(n); for(int i = 0; i < n; i++){ ret[i] = (x[i] == 'J' ? 0 : (x[i] == 'O' ? 1 : 2)); } return ret; }; vector<int> t = to_int(T); auto op = [&](vector<int> & x, vector<int> & y){ vector<int> ret(n); for(int i = 0; i < n; i++){ if(x[i] == y[i]) ret[i] = x[i]; else ret[i] = 3 - x[i] - y[i]; } return ret; }; vector<vector<int>> f(9); f[0] = to_int(A); f[1] = to_int(B); f[2] = to_int(C); f[3] = op(f[0], f[1]); f[4] = op(f[0], f[2]); f[5] = op(f[1], f[2]); f[6] = op(f[3], f[2]); f[7] = op(f[4], f[1]); f[8] = op(f[5], f[0]); auto to_set = [&](vector<int> & x){ set<pair<int, int>> y; int beg = 0; for(int i = 0; i < n; i++){ if(i + 1 == n || x[i] != x[i + 1]){ y.insert({beg, x[i]}); beg = i + 1; } } return y; }; vector<int> cnt(9); vector<set<pair<int, int>>> s(9); for(int i = 0; i < 9; i++) s[i] = to_set(f[i]); set<pair<int, int>> cur; function<void(int, int)> erase = [&](int sta, int val){ assert(cur.find({sta, val}) != cur.end()); cur.erase({sta, val}); for(int i = 0; i < 9; i++){ if(s[i].find({sta, val}) != s[i].end()) cnt[i]--; } auto it = cur.lower_bound({sta, val}); if(it != cur.end() && it != cur.begin()){ if(prev(it)->second == it->second){ erase(it->first, it->second); } } }; auto insert = [&](int sta, int val){ cur.insert({sta, val}); for(int i = 0; i < 9; i++){ if(s[i].find({sta, val}) != s[i].end()) cnt[i]++; } auto it = cur.find({sta, val}); if(next(it) != cur.end()){ if(it->second == next(it)->second){ erase(next(it)->first, next(it)->second); } } it = cur.find({sta, val}); if(it != cur.begin()){ if(prev(it)->second == it->second){ erase(it->first, it->second); } } }; auto fine = [&](){ bool ok = 0; for(int i = 0; i < 9; i++){ if(cnt[i] == (int)s[i].size() && cnt[i] == (int) cur.size()) ok = 1; } return ok; }; auto print = [&](set<pair<int, int>> &s){ for(auto [x, y] : s){ cout << x << ' ' << y << endl; } cout << endl; }; int beg = 0; for(int i = 0; i < n; i++){ if(i + 1 == n || t[i] != t[i + 1]){ insert(beg, t[i]); beg = i + 1; } } // for(int i = 0; i < 9; i++){ // cout << "printing " << i << endl; // print(s[i]); // } // cout << "printing t" << endl; // print(cur); cout << (fine() ? "Yes" : "No") << endl; for(int i = 0; i < q; i++){ int ql = u[i][0]; int qr = u[i][1]; int val = u[i][2]; int son = prev(cur.upper_bound({qr + 1, 2}))->second; while(cur.lower_bound({ql, 0}) != cur.end() && cur.lower_bound({ql, 0})->first <= qr){ auto it = cur.lower_bound({ql, 0}); erase(it->first, it->second); } insert(ql, val); if(qr + 1 < n){ if(cur.lower_bound({qr + 1, 0}) == cur.end() || cur.lower_bound({qr + 1, 0})->first > qr + 1) insert(qr + 1, son); } cout << (fine() ? "Yes" : "No") << endl; // cout << "printing t" << endl; // cout << cnt[2] << endl; // print(cur); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...