下面这个线段树 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;
}