Submission #429050

#TimeUsernameProblemLanguageResultExecution timeMemory
429050muhammad_hokimiyonCrossing (JOI21_crossing)C++14
100 / 100
1834 ms123712 KiB
#include <bits/stdc++.h>

#define fi first
#define se second
#define ll long long
#define dl double

using namespace std;

const int N = 2e5 + 7;
const long long mod = 1e9 + 7;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int n;
int A[N];
vector<vector<int>> col;

struct seg{
        int t[4 * N][3];

        void build(int x, int l, int r)
        {
                if(l == r){
                        t[x][A[l]] = 1;
                        return;
                }
                int m = (l + r) / 2;
                build(x + x, l, m);
                build(x + x + 1, m + 1, r);
                for(int i = 0; i < 3; i++){
                        t[x][i] = t[x + x][i] + t[x + x + 1][i];
                }
        }
} D[10];

int used[4 * N][20];

void go(int x)
{
        for(int i = 0; i < (int)col.size(); i++){
                used[x][i] = (used[x + x][i] & used[x + x + 1][i]);
        }
}

void go(int x, int l, int r, int val)
{
        for(int i = 0; i < (int)col.size(); i++){
                if(D[i].t[x][val] == r - l + 1)used[x][i] = 1;
                else used[x][i] = 0;
        }
}

void build(int x, int l, int r)
{
        if(l == r){
                go(x, l, r, A[l]);
                return;
        }
        int m = (l + r) / 2;
        build(x + x, l, m);
        build(x + x + 1, m + 1, r);
        go(x);
}

int lz[4 * N];

void push(int x, int l, int r)
{
        int m = (l + r) / 2;
        if(lz[x] != -1){
                lz[x + x] = lz[x + x + 1] = lz[x];
                go(x + x, l, m, lz[x]);
                go(x + x + 1, m + 1, r, lz[x]);
                lz[x] = -1;
        }
}

void upd(int x, int l, int r, int tl, int tr, int val)
{
        if(tl > tr)return;
        if(l == tl && r == tr){
                go(x, l, r, val);
                lz[x] = val;
                return;
        }
        int m = (l + r) / 2;
        push(x, l, r);
        upd(x + x, l, m, tl, min(tr, m), val);
        upd(x + x + 1, m + 1, r, max(tl, m + 1), tr, val);
        go(x);
}

vector<int> get(string s)
{
        vector<int> res;
        for(int i = 0; i < n; i++){
                if(s[i] == 'I')res.push_back(0);
                else if(s[i] == 'J')res.push_back(1);
                else res.push_back(2);
        }
        return res;
}

bool f()
{
        for(int i = 0; i < (int)col.size(); i++){
                if(used[1][i])return true;
        }
        return false;
}

void solve()
{
        cin >> n;
        vector<int> a(n),b(n),c(n);
        set<vector<int>> s;
        string st;
        cin >> st;
        a = get(st);
        cin >> st;
        b = get(st);
        cin >> st;
        c = get(st);
        s.insert(a);
        s.insert(b);
        s.insert(c);
        while(true){
                bool f = false;
                vector<int> id;
                for(auto x : s){
                        for(auto y : s){
                               if(f)break;
                               vector<int> v;
                               for(int i = 0; i < n; i++){
                                        if(x[i] == y[i]){
                                                v.push_back(x[i]);
                                        }else v.push_back(3 - x[i] - y[i]);
                               }
                               if(s.find(v) == s.end()){
                                        id = v;
                                        f = true;
                               }
                        }
                }
                if(!f)break;
                s.insert(id);
        }
        assert((int)s.size() <= 10);
        for(auto x : s){
                col.push_back(x);
        }
        int G = 0;
        for(auto x : col){
                for(int i = 0; i < n; i++){
                        A[i + 1] = x[i];
                }
                D[G].build(1, 1, n);
                G++;
        }
        for(int i = 0; i < 4 * N; i++)lz[i] = -1;
        int q;
        cin >> q;
        cin >> st;
        auto x = get(st);
        for(int i = 0; i < n; i++){
                A[i + 1] = x[i];
        }
        build(1, 1, n);
        if(f())cout << "Yes\n";
        else cout << "No\n";
        while(q--){
                int l,r;
                char g;
                cin >> l >> r >> g;
                int id = -1;
                if(g == 'I')id = 0;
                else if(g == 'J')id = 1;
                else id = 2;
                upd(1, 1, n, l, r, id);
                if(f())cout << "Yes\n";
                else cout << "No\n";
        }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    //freopen( "input.txt" , "r" , stdin );
    //freopen( "output.txt" , "w" , stdout );

    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...