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;
}

posted @ 2021-03-12 22:26  wansheking  阅读(103)  评论(0)    收藏  举报