Submission #861728

#TimeUsernameProblemLanguageResultExecution timeMemory
861728arbuzickModern Machine (JOI23_ho_t5)C++17
26 / 100
3103 ms489048 KiB
#include <bits/stdc++.h>

using namespace std;

void solve() {
    int n, m;
    cin >> n >> m;
    string s;
    cin >> s;
    vector<int> a(m);
    for (int i = 0; i < m; ++i) {
        cin >> a[i];
        a[i]--;
    }
    if (n == 10 && count(s.begin(), s.end(), 'R') == n) {
        vector<vector<int>> go(n, vector<int>(1 << n));
        for (int mask = 0; mask < (1 << n); ++mask) {
            for (int i = 0; i < n; ++i) {
                int mask_nw = mask;
                if (mask_nw & (1 << i)) {
                    mask_nw ^= (1 << i);
                }
                int pos = i;
                while (0 <= pos && pos < n) {
                    if (mask_nw & (1 << pos)) {
                        mask_nw ^= (1 << pos);
                        pos--;
                    } else {
                        mask_nw ^= (1 << pos);
                        pos++;
                    }
                }
                go[i][mask] = mask_nw;
            }
        }
        vector<int> jump_len(m - 1);
        vector<vector<int>> jump(m, vector<int>(1 << n));
        for (int i = m - 1; i >= 0; --i) {
            if (i + 1 < m && i + 1 + jump_len[i + 1] < m && jump_len[i + 1] == jump_len[i + 1 + jump_len[i + 1]]) {
                jump_len[i] = 1 + jump_len[i + 1] * 2;
                if (jump_len[i] == 3) {
                    for (int mask = 0; mask < (1 << n); ++mask) {
                        jump[i][mask] = go[a[i + 1 + jump_len[i + 1]]][go[a[i + 1]][go[a[i]][mask]]];
                    }
                } else {
                    for (int mask = 0; mask < (1 << n); ++mask) {
                        jump[i][mask] = jump[i + 1 + jump_len[i + 1]][jump[i + 1][go[a[i]][mask]]];
                    }
                }
            } else {
                jump_len[i] = 1;
            }
        }
        int q;
        cin >> q;
        while (q--) {
            int l, r;
            cin >> l >> r;
            l--;
            int mask = 0;
            int pos = l;
            while (pos < r) {
                if (jump_len[pos] > 1 && pos + jump_len[pos] <= r) {
                    mask = jump[pos][mask];
                    pos += jump_len[pos];
                } else {
                    mask = go[a[pos]][mask];
                    // mask = pr[pos][mask];
                    pos++;
                }
            }
            int cnt = 0;
            for (int i = 0; i < n; ++i) {
                if (!(mask & (1 << i))) {
                    cnt++;
                }
            }
            cout << cnt << '\n';
        }
        return;
    }
    int q;
    cin >> q;
    while (q--) {
        int l, r;
        cin >> l >> r;
        l--;
        string s_old = s;
        for (int i = l; i < r; ++i) {
            s[a[i]] = 'R';
            int pos = a[i];
            int l_nw = a[i], r_nw = a[i] + 1;
            char ch = 'R';
            while (0 <= pos && pos < n) {
                l_nw = min(l_nw, pos);
                r_nw = max(r_nw, pos + 1);
                if (s[pos] == 'R') {
                    while (r_nw < n && s[r_nw] == 'R') {
                        r_nw++;
                    }
                    ch = 'B';
                    pos = r_nw;
                } else {
                    while (l_nw > 0 && s[l_nw - 1] == 'B') {
                        l_nw--;
                    }
                    ch = 'R';
                    pos = l_nw - 1;
                }
            }
            fill(s.begin() + l_nw, s.begin() + r_nw, ch);
        }
        cout << count(s.begin(), s.end(), 'R') << '\n';
        s = s_old;
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (t--) {
        solve();
    }
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...