线段树 WA on 5#求调
查看原帖
线段树 WA on 5#求调
678191
Eric_jx楼主2023/8/29 18:29
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
    long long x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
inline void write(long long x){
    if(x==0){putchar('0');return;}
    long long len=0,k1=x,c[10005];
    if(k1<0)k1=-k1,putchar('-');
    while(k1)c[len++]=k1%10+'0',k1/=10;
    while(len--)putchar(c[len]);
}
long long a[100005];
struct Node{
	long long l,r,s=0,lazy=0;
}t[22][100005];
void build_suan(long long i,long long p,long long x){
	long long cnt=0;
	while(x){
		cnt++;
		if(cnt==i){
			t[i][p].s=x%2;
			return;
		}
		x>>=1;
	}
}
void build(long long p,long long l,long long r,long long i){
	t[i][p].l=l,t[i][p].r=r;
	if(l==r){
		build_suan(i,p,a[l]);
		return;
	}
	long long mid=(l+r)>>1;
	build(p*2,l,mid,i);
	build(p*2+1,mid+1,r,i);
	t[i][p].s=t[i][p*2].s+t[i][p*2+1].s; 
}
void change(long long p,long long x,long long y,long long i){
	long long l=t[i][p].l,r=t[i][p].r;
	if(l>=x&&r<=y){
		t[i][p].s=(r-l+1)-t[i][p].s;
		t[i][p].lazy=1;
		return;
	}
	if(t[i][p].lazy){
		t[i][p*2].lazy=1,t[i][p*2+1].lazy=1;
		t[i][p*2].s=(t[i][p*2].r-t[i][p*2].l+1)-t[i][p*2].s;
		t[i][p*2+1].s=(t[i][p*2+1].r-t[i][p*2+1].l+1)-t[i][p*2+1].s;
		t[i][p].lazy=0;
	}
	long long mid=(l+r)>>1;
	if(mid>=x){
		change(p*2,x,y,i);
	}
	if(mid<y){
		change(p*2+1,x,y,i);
	}
	t[i][p].s=t[i][p*2].s+t[i][p*2+1].s;
}
long long ask(long long p,long long x,long long y,long long i){
	long long l=t[i][p].l,r=t[i][p].r;
	if(l>=x&&r<=y){
		return t[i][p].s;
	}
	if(t[i][p].lazy){
		t[i][p*2].lazy=1,t[i][p*2+1].lazy=1;
		t[i][p*2].s=(t[i][p*2].r-t[i][p*2].l+1)-t[i][p*2].s;
		t[i][p*2+1].s=(t[i][p*2+1].r-t[i][p*2+1].l+1)-t[i][p*2+1].s;
		t[i][p].lazy=0;
	}
	long long mid=(l+r)>>1,ans=0;
	if(mid>=x){
		ans+=ask(p*2,x,y,i);
	}
	if(mid<y){
		ans+=ask(p*2+1,x,y,i);
	}
	return ans;
}
long long bin[25];
int main(){
	long long n=read();
	for(long long i=1;i<=n;i++){
		a[i]=read();
	}
	bin[0]=1;
	for(long long i=1;i<=22;i++){
		bin[i]=bin[i-1]*2;
	}
	for(long long i=1;i<=21;i++){
		build(1,1,n,i);
	}
	long long m=read();
	while(m--){
		long long op=read();
		if(op==1){
			long long l,r;
			cin>>l>>r;
			long long res=0;
			for(long long i=1;i<=21;i++){
				res+=ask(1,l,r,i)*bin[i-1];
			}
			write(res);
			puts("");
		}
		else{
			long long l=read(),r=read(),x=read();
			long long cnt=0;
			while(x){
				cnt++;
				if(x%2==1){
					change(1,l,r,cnt);
				} 
				x>>=1;
			}
		}
	}
	return 0;
}

2023/8/29 18:29
加载中...