Submission #1165292

#TimeUsernameProblemLanguageResultExecution timeMemory
1165292HanksburgerCrossing (JOI21_crossing)C++20
100 / 100
1951 ms68364 KiB
#include <bits/stdc++.h>
using namespace std;
int cnt[9][200005][3], seg[9][800005], lazy[9][800005], n, q;
vector<int> vec[9], initial;
vector<int> cross(vector<int> x, vector<int> y)
{
    vector<int> res;
    for (int i=0; i<n; i++)
        res.push_back((x[i]*2+y[i]*2)%3);
    return res;
}
void push(int ii, int i, int l, int r)
{
    if (!lazy[ii][i] || l==r)
        return;
    int mid=(l+r)/2;
    seg[ii][i*2]=cnt[ii][mid][lazy[ii][i]-1]-(l==0?0:cnt[ii][l-1][lazy[ii][i]-1]);
    seg[ii][i*2+1]=cnt[ii][r][lazy[ii][i]-1]-cnt[ii][mid][lazy[ii][i]-1];
    lazy[ii][i*2]=lazy[ii][i];
    lazy[ii][i*2+1]=lazy[ii][i];
    lazy[ii][i]=0;
}
void build(int ii, int i, int l, int r)
{
    if (l==r)
    {
        seg[ii][i]=(vec[ii][l]==initial[l]);
        return;
    }
    int mid=(l+r)/2;
    build(ii, i*2, l, mid);
    build(ii, i*2+1, mid+1, r);
    seg[ii][i]=seg[ii][i*2]+seg[ii][i*2+1];
}
void update(int ii, int i, int l, int r, int ql, int qr, int x)
{
    if (ql<=l && r<=qr)
    {
        seg[ii][i]=cnt[ii][r][x]-(l==0?0:cnt[ii][l-1][x]);
        lazy[ii][i]=x+1;
        return;
    }
    push(ii, i, l, r);
    int mid=(l+r)/2;
    if (l<=qr && ql<=mid)
        update(ii, i*2, l, mid, ql, qr, x);
    if (mid<qr && ql<=r)
        update(ii, i*2+1, mid+1, r, ql, qr, x);
    seg[ii][i]=seg[ii][i*2]+seg[ii][i*2+1];
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i=0; i<3; i++)
    {
        for (int j=0; j<n; j++)
        {
            char x;
            cin >> x;
            vec[i].push_back(x=='J'?0:(x=='O'?1:2));
        }
    }
    vec[3]=cross(vec[0], vec[1]);
    vec[4]=cross(vec[1], vec[2]);
    vec[5]=cross(vec[2], vec[0]);
    vec[6]=cross(vec[2], vec[3]);
    vec[7]=cross(vec[0], vec[4]);
    vec[8]=cross(vec[1], vec[5]);
    cin >> q;
    for (int i=0; i<n; i++)
    {
        char x;
        cin >> x;
        initial.push_back(x=='J'?0:(x=='O'?1:2));
    }
    for (int i=0; i<9; i++)
    {
        for (int j=0; j<n; j++)
            for (int k=0; k<3; k++)
                cnt[i][j][k]=(j==0?0:cnt[i][j-1][k])+(vec[i][j]==k);
        build(i, 1, 0, n-1);
    }
    int OK=0;
    for (int j=0; j<9; j++)
        if (seg[j][1]==n)
            OK=1;
    cout << (OK?"Yes":"No") << '\n';
    for (int i=0; i<q; i++)
    {
        int l, r, x, ok=0;
        char xx;
        cin >> l >> r >> xx;
        l--, r--;
        x=(xx=='J'?0:(xx=='O'?1:2));
        for (int j=0; j<9; j++)
        {
            update(j, 1, 0, n-1, l, r, x);
            if (seg[j][1]==n)
                ok=1;
        }
        cout << (ok?"Yes":"No") << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...