萌新刚学OI,求调
查看原帖
萌新刚学OI,求调
551760
Kketchup楼主2023/3/22 20:39

Rt,样例都没过。求助

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int N=1e5+10;
int n,m;
int op,l,r,x;
int a[N];

#define ls p<<1
#define rs p<<1|1
#define forr() for(int i=0;i<20;++i)

struct tree{
	int l,r;
	long long lazy;
	int c[20];
}t[N<<2];

inline void pushup(int p){forr() t[p].c[i]=t[ls].c[i]+t[rs].c[i];}
inline void pushdown(int p){
	if(t[p].lazy){
		int mid=(t[p].l+t[p].r)>>1;
		forr(){
			if((t[p].lazy>>i)&1){
				t[ls].c[i]=(mid-l+1)-t[ls].c[i];
				t[rs].c[i]=(r-mid)-t[rs].c[i];
			}
		}t[ls].lazy^=t[p].lazy,t[rs].lazy^=t[p].lazy;
		t[p].lazy=0;
	}
}

void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		forr(){
			if((a[l]>>i)&1) t[p].c[i]=1;
			else t[p].c[i]=0;
		}return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}

void update(int p,int l,int r,int k){
//	if(t[p].r<l||r<t[p].l)return ;
	if(l<=t[p].l&&t[p].r<=r){
		forr() if((k>>i)&1) t[p].c[i]=(t[p].r-t[p].l+1)-t[p].c[i];
		t[p].lazy^=k;
		return ;
	}pushdown(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) update(ls,l,r,k);
	if(mid+1<=r) update(rs,l,r,k);
	pushup(p);
}

long long query(int p,int l,int r){
//	if(t[p].r<l||r<t[p].l)return 0;
	if(l<=t[p].l&&t[p].r<=r){
		long long res=0,pow=1;
		forr() res+=pow*t[p].c[i],pow<<=1;
		return res;
	}pushdown(p);
	long long ans=0;
	int mid=(t[p].l+t[p].r)>>1;
	if(l<=mid) ans+=query(ls,l,r);
	if(mid+1<=r) ans+=query(rs,l,r);
	return ans;
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	build(1,1,n);
	scanf("%d",&m);
	while(m--){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1){
			printf("%lld\n",query(1,l,r));
		}
		else{
			scanf("%d",&x);
			update(1,l,r,x);
		}
	}
	return 0;
}
2023/3/22 20:39
加载中...