제출 #1304874

#제출 시각아이디문제언어결과실행 시간메모리
1304874BilAktauAlmansurCrossing (JOI21_crossing)C++20
0 / 100
50 ms816 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 + 7, mod1 = 1e9 + 9, b = 31, b1 = 47;

int n, m, pw[N][2], add[4 * N];
pair<int, int> tr[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].fi = ((s[lx - 1] - '0' + 1) * (lx * b % mod)) % mod;
        tr[v].se = ((s[lx - 1] - '0' + 1) * (lx * b1 % mod1)) % mod1;
        return;
    }
    int m = (lx + rx) >> 1;
    build(v + v, lx, m);
    build(v + v + 1, m + 1, rx);
    tr[v].fi = (tr[v + v].fi + tr[v + v + 1].fi) % mod;
    tr[v].se = (tr[v + v].se + tr[v + v + 1].se) % mod1;
}
int calc(int l, int r, int d) {
    if(d == 0) {
        return (pw[r][d] - pw[l - 1][d] + mod) % mod;
    }else {
        return (pw[r][d] - pw[l - 1][d] + mod1) % mod1;
    }
}
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].fi = (add[v] * calc(lx, rx, 0)) % mod;
    tr[v].se = (add[v] * calc(lx, rx, 1)) % mod1;
    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].fi = (tr[v + v].fi + tr[v + v + 1].fi) % mod;
    tr[v].se = (tr[v + v].se + tr[v + v + 1].se) % mod1;
}
pair<int, int> comb(pair<int, int> x, pair<int, int> y) {
    return {(x.fi + y.fi) % mod, (x.se + y.se) % mod1};
}
pair<int, int> get(int l, int r, int v, int lx, int rx) {
    push(v, lx, rx);
    if(lx > r || l > rx)return {0, 0};
    if(lx >= l && r >= rx)return tr[v];
    int m = (lx + rx) >> 1;
    return comb(get(l, r, v + v, lx, m), get(l, r, v + v + 1, m + 1, rx));
}
void solve() {
    cin>>n;
    for(int i = 1; i <= n; i++) {
        pw[i][0] = (pw[i - 1][0] + (i * b % mod)) % mod;
        pw[i][1] = (pw[i - 1][1] + (i * b1 % mod1)) % mod1; 
    }
    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<pair<int, int>, int> mp;
    for(int i = 0; i < 9; i++) {
        int sum = 0, sum1 = 0;
        for(int j = 1; j <= n; j++) {
            sum = (sum + ((t[i][j - 1] - '0' + 1) * (j * b % mod)) % mod) % mod;
            sum1 = (sum1 + ((t[i][j - 1] - '0' + 1) * (j * b1 % mod1)) % mod1) % mod1;
        }
        mp[{sum, sum1}] = 1;
    }
    int q;
    cin>>q;
    cin>>s;
    build(1, 1, n);
    pair<int, 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...