Submission #864184

#TimeUsernameProblemLanguageResultExecution timeMemory
864184vjudge1Crossing (JOI21_crossing)C++17
100 / 100
3830 ms231412 KiB
#include <bits/stdc++.h>
using namespace std;
int n, p;
char d;
vector<int> wl, wr;
vector<vector<int> > sg, lz;
vector<vector<vector<int> > > pf;
vector<int> x(vector<int> u, vector<int> v)
{
    vector<int> an(n);
    for (int i = 0; i < n; i++)
        an[i] = (6 - u[i] - v[i]) % 3;
    return an;
}
vector<int> ct()
{
    vector<int> an(n);
    for (int i = 0; i < n; i++)
    {
        cin >> d;
        if (d == 'O')
            an[i] = 0;
        else if (d == 'I')
            an[i] = 1;
        else
            an[i] = 2;
    }
    return an;
}
void push(int i, int j)
{
    if (lz[i][j] == -1)
        return;
    sg[i][j] = pf[wr[i] - p][j][lz[i][j]] - pf[wl[i] - p][j][lz[i][j]];
    if (i < p)
        lz[2 * i][j] = lz[2 * i + 1][j] = lz[i][j];
    lz[i][j] = -1;
    return;
}
int qsum(int l, int r, int i, int j)
{
    push(i, j);
    if (wl[i] >= r || wr[i] <= l)
        return 0;
    if (wl[i] >= l && wr[i] <= r)
        return sg[i][j];
    return qsum(l, r, 2 * i, j) + qsum(l, r, 2 * i + 1, j);
}
void rset(int l, int r, int i, int j, int w)
{
    push(i, j);
    if (wl[i] >= r || wr[i] <= l)
        return;
    if (wl[i] >= l && wr[i] <= r)
    {
        lz[i][j] = w;
        push(i, j);
        return;
    }
    rset(l, r, 2 * i, j, w);
    rset(l, r, 2 * i + 1, j, w);
    sg[i][j] = sg[2 * i][j] + sg[2 * i + 1][j];
    return;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int i, j, k, q, l, r;
    bool z = false;
    cin >> n;
    vector<int> a = ct(), b = ct(), c = ct();
    vector<vector<int> > pos = {a, b, c, x(b, c), x(c, a), x(a, b), x(a, x(b, c)), x(b, x(c, a)), x(c, x(a, b))};
    p = n;
    while (p != (p & -p))
        p++;
    pf.resize(p + 1);
    for (i = 0; i <= p; i++)
    {
        pf[i].resize(9);
        for (j = 0; j < 9; j++)
        {
            pf[i][j].resize(3);
            for (k = 0; k < 3; k++)
            {
                if (i)
                {
                    pf[i][j][k] = pf[i - 1][j][k];
                    if (i <= n && pos[j][i - 1] == k)
                        pf[i][j][k]++;
                }
                else
                    pf[i][j][k] = 0;
            }
        }
    }
    cin >> q;
    vector<int> v = ct();
    wl.resize(2 * p);
    wr.resize(2 * p);
    sg.resize(2 * p);
    lz.resize(2 * p);
    for (i = p; i < 2 * p; i++)
    {
        sg[i].resize(9);
        lz[i].resize(9);
        for (j = 0; j < 9; j++)
        {
            if (i < p + n && pos[j][i - p] == v[i - p])
                sg[i][j] = 1;
            else
                sg[i][j] = 0;
            lz[i][j] = -1;
        }
        wl[i] = i;
        wr[i] = i + 1;
    }
    for (i = p - 1; i > 0; i--)
    {
        sg[i].resize(9);
        lz[i].resize(9);
        for (j = 0; j < 9; j++)
        {
            sg[i][j] = sg[2 * i][j] + sg[2 * i + 1][j];
            lz[i][j] = -1;
        }
        wl[i] = wl[2 * i];
        wr[i] = wr[2 * i + 1];
    }
    for (j = 0; j < 9; j++)
    {
        if (qsum(p, 2 * p, 1, j) == n)
            z = true;
    }
    if (z)
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    while (q--)
    {
        cin >> l >> r >> d;
        if (d == 'O')
            k = 0;
        else if (d == 'I')
            k = 1;
        else
            k = 2;
        z = false;
        for (j = 0; j < 9; j++)
        {
            rset(p + l - 1, p + r, 1, j, k);
            if (qsum(p, 2 * p, 1, j) == n)
                z = true;
        }
        if (z)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    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...