MnZn求助玄学问题
查看原帖
MnZn求助玄学问题
469066
zzxLLL楼主2022/2/12 23:24

CF242E

用scanf会WA,用cin会MLE

MnZn调了一下午了,求助大佬

#include<cstdio>
#include<iostream>
#define int long long
using namespace std;
const int M=1e5+10;

int n,m,a[M];

struct node{
	int l,r,val;
	bool lazy;
}tr[M<<2][21];

void pushup(int k,int ch){
	tr[k][ch].val=tr[k<<1][ch].val+tr[k<<1|1][ch].val;
}

void pushdown(int k,int ch){
	if(tr[k][ch].lazy){
		tr[k<<1][ch].lazy=!tr[k<<1][ch].lazy;
		tr[k<<1|1][ch].lazy=!tr[k<<1|1][ch].lazy;
		tr[k<<1][ch].val=(tr[k<<1][ch].r-tr[k<<1][ch].l+1)-tr[k<<1][ch].val;
		tr[k<<1|1][ch].val=(tr[k<<1|1][ch].r-tr[k<<1|1][ch].l+1)-tr[k<<1|1][ch].val;
		tr[k][ch].lazy=!tr[k][ch].lazy;
	}
}

void build(int k,int l,int r,int ch){
	tr[k][ch].l=l,tr[k][ch].r=r;
	if(l==r){
		tr[k][ch].val=((a[l]&(1<<ch))!=0);
		tr[k][ch].lazy=false;
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid,ch);
	build(k<<1|1,mid+1,r,ch);
	pushup(k,ch);
}

void update(int k,int l,int r,int ch){
	if(l<=tr[k][ch].l&&tr[k][ch].r<=r){
		tr[k][ch].lazy=!tr[k][ch].lazy;
		tr[k][ch].val=(tr[k][ch].r-tr[k][ch].l+1)-tr[k][ch].val;
		return;
	}
	pushdown(k,ch);
	int mid=(tr[k][ch].l+tr[k][ch].r)>>1;
	if(l<=mid) update(k<<1,l,r,ch);
	if(r>mid)  update(k<<1|1,l,r,ch);
	pushup(k,ch);
}

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

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=0;i<=20;i++) build(1,1,n,i);
	
	cin>>m;
	while(m--){
		int opt,l,r,x;
		cin>>opt;
		if(opt==1){
			cin>>l>>r;
			int sum=0;
			for(int i=0;i<=20;i++) sum+=(1<<i)*query(1,l,r,i);
			cout<<sum<<endl;
		}
		if(opt==2){
			cin>>l>>r>>x;
			for(int i=0;i<=20;i++)
				if((x&(1<<i))!=0) update(1,l,r,i);
		}	
	}
	return 0;
}
2022/2/12 23:24
加载中...