Nezzar and Binary String
题目:E. Nezzar and Binary String
从后往前思考,会发现如果不让他生气,每次修改的操作都是唯一的。
我们只需要统计当前区间内有多少个1和0,如果当前区间内的1严格小于一半,那么就全部翻成0,如果当前区间内的1严格大于一半,那么就全部翻成1,如果1和0个数相同,直接输出无解
用线段树维护区间内 1 的个数,和区间赋值操作。
typedef pair<int, int> pii;
const int inf = 0x3f3f3f3f;
const int maxn = 2e5 + 10;
const ll mod = 1e9 + 7;
struct node{
int l, r;
int sum;
int flag;
}t[maxn << 2];
int init[maxn];
int a[maxn];
pii b[maxn];
void pushup(int rt){
t[rt].sum = t[rt << 1].sum + t[rt << 1 | 1].sum;
}
void pushdown(int rt){
if (t[rt].flag != -1){
t[rt << 1].flag = t[rt << 1 | 1].flag = t[rt].flag;
t[rt << 1].sum = (t[rt << 1].r - t[rt << 1].l + 1) * t[rt << 1].flag;
t[rt << 1 | 1].sum = (t[rt << 1 | 1].r - t[rt << 1 | 1].l + 1) * t[rt << 1 | 1].flag;
t[rt].flag = -1;
}
}
void build(int rt, int l, int r){
t[rt] = { l, r, 0, -1 };
if (l == r){
t[rt].sum = a[l];
return;
}
int mid = l + r >> 1;
build(rt << 1, l, mid), build(rt << 1 | 1, mid + 1, r);
pushup(rt);
}
void update(int rt, int l, int r, int val){
if (l <= t[rt].l && t[rt].r <= r){
t[rt].flag = val;
t[rt].sum = (t[rt].r - t[rt].l + 1) * t[rt].flag;
return;
}
pushdown(rt);
int mid = t[rt].r + t[rt].l >> 1;
if (l <= mid) update(rt << 1, l, r, val);
if (r > mid) update(rt << 1 | 1, l, r, val);
pushup(rt);
}
int query(int rt, int l, int r){
if (l <= t[rt].l && t[rt].r <= r)
return t[rt].sum;
pushdown(rt);
int mid = t[rt].r + t[rt].l >> 1;
int res = 0;
if (l <= mid) res += query(rt << 1, l, r);
if (r > mid) res += query(rt << 1 | 1, l, r);
return res;
}
int main(){
int t; scanf("%d", &t);
while (t--){
int n, q; scanf("%d %d", &n, &q);
for (int i = 1; i <= n; i++) scanf("%1d", init + i);
for (int i = 1; i <= n; i++) scanf("%1d", a + i);
for (int i = 1; i <= q; i++) cin >> b[i].first >> b[i].second;
build(1, 1, n);
int flag = 0;
for (int i = q; i >= 1; i--){
int l = b[i].first, r = b[i].second;
int num = r - l >> 1;
int one = query(1, l, r);
int zero = r - l + 1 - one;
if (zero <= num) update(1, l, r, 1);
else if (one <= num) update(1, l, r, 0);
else{
flag = 1;
break;
}
}
for (int i = 1; i <= n; i++)
if (init[i] != query(1, i, i)){
flag = 1;
break;
}
if (flag) puts("NO");
else puts("YES");
}
return 0;
}