暴力吊打线段树
查看原帖
暴力吊打线段树
353113
Engiassca楼主2021/5/27 12:50
#include<bits/stdc++.h>
using namespace std;

int n,m,s[100010];

int main(){
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(register int i=1;i<=m;i++){
		register int a,b,c,ans=0;
		cin>>a>>b>>c;
		if(!a){
			for(int i=b;i<=c;i++)
		 		s[i]^=1;
		}
		else {
			for(int i=b;i<=c;i++)
				ans+=s[i];
			cout<<ans<<"\n";
		}
	}
	return 0;
}

暴力

#include<bits/stdc++.h>
using namespace std;
const int N = 500010;
 
int n,m,c,a,b,v[N],tag[N];

void pushup(int pos){
	v[pos]=v[pos<<1]+v[pos<<1|1];
}

void pushdown(int pos,int l,int r){
	int mid=(l+r)>>1;
	
	tag[pos<<1]^=(tag[pos]&1);
	if(tag[pos]&1) v[pos<<1]=(mid-l+1-v[pos<<1]);
	
	tag[pos<<1|1]^=(tag[pos]&1);
	if(tag[pos]&1) v[pos<<1|1]=(r-mid-v[pos<<1|1]);
	
	tag[pos]=0;
}

void Xor(int pos,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r){
		v[pos]=(r-l+1-v[pos]);
		tag[pos]^=1;
		return;
	}
	pushdown(pos,l,r);
	int mid=(l+r)>>1;
	if(ql<=mid) Xor(pos<<1,l,mid,ql,qr);
	if(qr>mid) Xor(pos<<1|1,mid+1,r,ql,qr);
	pushup(pos);
}

int Sum(int pos,int l,int r,int ql,int qr){
	if(ql<=l&&qr>=r) return v[pos];
	pushdown(pos,l,r);
	int ans=0,mid=(l+r)>>1;
	if(ql<=mid) ans+=Sum(pos<<1,l,mid,ql,qr);
	if(qr>mid) ans+=Sum(pos<<1|1,mid+1,r,ql,qr);
	return ans;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>c>>a>>b;
		if(c){
			cout<<Sum(1,1,n,a,b)<<"\n";
		}
		else Xor(1,1,n,a,b);
	}
	return 0;
}

线段树

2021/5/27 12:50
加载中...