求助线段树
查看原帖
求助线段树
302394
dingshengyang楼主2021/12/12 15:04

code:

#include <bits/stdc++.h>
#define R register
#define inl inline
#define fastios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define Debug(file) freopen(file".in","r",stdin);freopen(file".out","w",stdout);
using namespace std;
const int N = 2e5 + 5;
int n,m,op,l,r;
int a[N];

struct node{
	int l,r,sum,lazy;
}tr[N<<2];

void pushup(int u){
	tr[u].sum = tr[u<<1].sum + tr[u<<1|1].sum;
}

void pushdown(int u){
	node &l = tr[u<<1],&r = tr[u<<1|1];
	l.sum = (l.r - l.l + 1)-l.sum,l.lazy ++;
	r.sum = (r.r - r.l + 1)-r.sum,r.lazy ++;
	tr[u].lazy = 0;
}

void build(int u,int l,int r){
	if(l==r)tr[u]={l,r,0,0};
	else {
		const int mid = l + r >> 1;
		tr[u].l = l,tr[u].r = r;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		pushup(u);
	}
}

void modify(int u,int l,int r){
	if(tr[u].l <= l && r <= tr[u].r){
		tr[u].sum = (tr[u].r - tr[u].l + 1)-tr[u].sum;
		tr[u].lazy ++;
	}else{
		pushdown(u);
		int mid = tr[u].l + tr[u].r >> 1;
		if(l<=mid)modify(u<<1,l,r);
		if(r>mid)modify(u<<1|1,l,r);
		pushup(u);
	}
}

int query(int u,int l,int r){
	if(l <= tr[u].l && tr[u].r <= r){
		return tr[u].sum;
	}else{
		pushdown(u);
		int mid = tr[u].l + tr[u].r >> 1;
		int ans = 0;
		if(l <= mid)ans = query(u<<1,l,r);
		if(r > mid)ans += query(u<<1|1,l,r);
		return ans;
	}
}

int main() {
	cin >> n >> m;
	char s[N]={};
	scanf("%s",s);
	for(int i = 0;i < n;i ++)a[i] = s[i]-'0';
	build(1,1,n);
	while(m--){
		cin >> op >> l >> r;
		if(op){
			cout << query(1,l,r) << endl;
		}else{
			modify(1,l,r);
		}
	}
	return 0;
}

2021/12/12 15:04
加载中...