样例过了,提交全WA
查看原帖
样例过了,提交全WA
801371
Midnight_szx楼主2023/4/9 09:05
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n, m;
char c;
struct node {
	int ans;
	int tag;
}T[200005 << 2];
int a[200005];
inline int ls(int p) {
	return p << 1;
}
inline int rs(int p) {
	return p << 1 | 1;
}
inline void pushup(int p) {
	T[p].ans = T[ls(p)].ans + T[rs(p)].ans;
}
inline void build(int l, int r, int p) {
	T[p].tag = 0;
	if(l == r) {
		T[p].ans = a[l];
		return;
	}
	int mid = (l + r) >> 1;
	build(l, mid, ls(p));
	build(mid + 1, r, rs(p));
	pushup(p);
}
inline void pushdown(int l, int r, int p) {
	int len = r - l + 1;
	if(T[p].tag) {
		T[ls(p)].tag = 1 - T[ls(p)].tag;
		T[rs(p)].tag = 1 - T[rs(p)].tag;
		T[ls(p)].ans = (len - len >> 1) - T[ls(p)].ans;
		T[rs(p)].ans = (len >> 1) - T[rs(p)].ans;
		T[p].tag = 0;
	}
}
inline int query(int sl, int sr, int l, int r, int p) {
	if(r < sl or l > sr)
	    return 0;
	if(sl <= l and r <= sr) 
		return T[p].ans;
	pushdown(l, r, p);
	int mid = (l + r) >> 1;
	int k = 0; 
	if(sl <= mid)k += query(sl, sr, l, mid, ls(p));
	if(sr > mid)k += query(sl, sr, mid + 1, r, rs(p));
	return k;
}
inline void update(int sl, int sr, int l, int r, int p) {
	if(l > sr or r < sl)
	    return;
	if(sl <= l and r <= sr) {
		T[p].tag ^= 1;
		T[p].ans = r - l + 1 - T[p].ans;
		return;
	}
	pushdown(l, r, p);
	int mid = (l + r) >> 1;
	if(sl <= mid)update(sl, sr, l, mid, ls(p));
	if(sr > mid)update(sl, sr, mid + 1, r, rs(p));
	pushup(p);
}
signed main() {
	std::ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i = 1; i <= n; i++) {
		c = getchar();
		a[i] = c - '0';
		//cout<<a[i]<<" ";
	}
	build(1, n, 1);
	int op, x, y;
	while(m--) {
		cin>>op>>x>>y;
		if(op == 0) 
			update(x, y, 1, n, 1);
		if(op == 1) 
			cout<<query(x, y, 1, n, 1)<<'\n';
	}
	return 0;
}
2023/4/9 09:05
加载中...