蒟蒻WA26求条
查看原帖
蒟蒻WA26求条
767155
a_small_penguin楼主2025/7/30 21:43
#include <bits/stdc++.h>
using namespace std;

#define N 500009
#define ls (i << 1)
#define rs ((i << 1) | 1)

int n, q;
string s;
namespace xds{
    struct V{
        int l, r;
        bool d;
        int ld, rd, lazy;
        inline V hb (const V a) {
            V c;
            c.l = l, c.r = a.r;
            c.ld = ld, c.rd = a.rd;
            c.d = d && a.d && (rd != a.ld);
            return c;
        }
    }tree[(N << 2)];
    inline void build(int i, int l, int r) {
        tree[i].l = l, tree[i].r = r;
        if(l == r) {
            tree[i].ld = tree[i].rd = s[l] - '0';
            tree[i].d = 1;
            return;
        }
        int mid = (l + r) >> 1;
        build(ls, l, mid);
        build(rs, mid + 1, r);
        tree[i] = tree[ls].hb(tree[rs]);
    }
    inline void pd(int i) {
        tree[ls].ld ^= 1, tree[ls].rd ^= 1, tree[ls].lazy ^= 1;
        tree[rs].ld ^= 1, tree[rs].rd ^= 1, tree[rs].lazy ^= 1;
        tree[i].lazy ^= 1;
    }
    inline void op(int i, int l, int r) {
        if(l <= tree[i].l && tree[i].r <= r) {
            tree[i].ld ^= 1, tree[i].rd ^= 1;
            tree[i].lazy ^= 1;
            return;
        }
        if(tree[i].lazy) pd(i);
        int mid = (tree[i].l + tree[i].r) >> 1;
        if(l <= mid) op(ls, l, r);
        if(mid < r) op(rs, l, r);
        tree[i] = tree[ls].hb(tree[rs]);
    }
    inline V ask(int i, int l, int r) {
        if(l <= tree[i].l && tree[i].r <= r) return tree[i];
        if(tree[i].lazy) pd(i);
        int mid = (tree[i].l + tree[i].r) >> 1;
        if(l <= mid && mid < r) return ask(ls, l, r).hb(ask(rs, l, r));
        if(l <= mid) return ask(ls, l, r);
        return ask(rs, l, r); 
    }
}


int main() {

    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> q >> s;
    s = " " + s;
    xds::build(1, 1, n);
    while(q--) {
        int op, x, y;
        cin >> op >> x >> y;
        if(op == 1) xds::op(1, x, y);
        else if(xds::ask(1, x, y).d) cout << "Yes\n";
        else cout << "No\n";
        if(op == 2) cout << xds::ask(1, x, y).d << "\n"; // (1)
    }

    return 0;

}

另外想问一下,本地跑加上(1)(1),样例一可以输出正确答案(忽略输出的 0011)。但不加上(1)(1)时,却不能输出正确答案。

2025/7/30 21:43
加载中...