WA #12 求助
查看原帖
WA #12 求助
689146
mushezi楼主2023/11/12 22:25

下面这个线段树 vis[i] == 1 表示 i 在这个区间出现过 求助为什么这个做法不对,求反例,谢谢~

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;

#define lc u<<1
#define rc u<<1|1

struct Node{
    int x, y;
    bitset<105> vis;

    void tag(int cx, int cy){
        if(!vis[cx]) return ;
        vis[cy] = 1;
        vis[cx] = 0;
        x = cx, y = cy;
    }
} t[N << 2];

int arr[N], n, q;

void Up(int u){
    t[u].vis = t[lc].vis | t[rc].vis;
}

void Dn(int u){
    t[lc].tag(t[u].x, t[u].y);
    t[rc].tag(t[u].x, t[u].y);
    t[u].x = 0;
    t[u].y = 0;
}

void Build(int u, int l, int r){
    if(l == r){
        t[u].vis[arr[l]] = 1;
        return ;
    }

    int mid = (l + r) >> 1;
    Build(lc, l, mid);
    Build(rc, mid + 1, r);
    Up(u);
}

void Modify(int u, int l, int r, int L, int R, int cx, int cy){
    if(L <= l && r <= R){
        t[u].tag(cx, cy);
        return ;
    }

    Dn(u);
    int mid = (l + r) >> 1;
    if(L <= mid) Modify(lc, l, mid, L, R, cx, cy);
    if(R > mid) Modify(rc, mid + 1, r, L, R, cx, cy);
    Up(u);
}

void Print(int u, int l, int r){
    if(l == r){
        for(int i = 1; i <= 100; i++){
            if(t[u].vis[i]){
                cout << i << ' ';
                return ;
            }
        }
    }

    Dn(u);
    int mid = (l + r) >> 1;
    Print(lc, l, mid);
    Print(rc, mid + 1, r);
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
    }

    Build(1, 1, n);

    cin >> q;
    while(q--){
        int l, r, x, y;
        cin >> l >> r >> x >> y;
        if(x == y) continue;
        Modify(1, 1, n, l, r, x, y);
    }

    Print(1, 1, n);
    
    return 0;
}

2023/11/12 22:25
加载中...