萌新刚学OI,分块写炸了,前16个点ac,然后等一会就uke了
查看原帖
萌新刚学OI,分块写炸了,前16个点ac,然后等一会就uke了
461616
Judgelight楼主2022/12/1 14:30
#include<bits/stdc++.h>
#define N 200009
#define M 32
#define int long long
using namespace std;
int n,m,len,ans;
inline int get(int i){
	return (i-1ll)/len+1ll;
}
inline int from(int i){
	return (i-1ll)*len+1ll;
}
inline int to(int i){
	return min(n,i*len);
}
bool a[N][M];
struct Block{
	int sum[2];
	bool add;
}block[N][M];
int query(int l,int r,int k){
	int ans=0;
	if(get(l)==get(r)){
		for(int i=l;i<=r;i++){
			ans+=a[i][k]^block[get(i)][k].add;
		}
		return ans;
	}
	for(int i=l;i<=to(get(l));i++){
		ans+=a[i][k]^block[get(i)][k].add;
	}
	for(int i=from(get(r));i<=r;i++){
		ans+=a[i][k]^block[get(i)][k].add;
	}
	for(int i=get(l)+1;i<=get(r)-1;i++){
		ans+=block[i][k].sum[1];
	}
	return ans;
}
void modify(int l,int r,int k,int x){
	if(x==0){
		return ;
	}
	if(get(l)==get(r)){
		for(int i=l;i<=r;i++){
			block[get(i)][k].sum[a[i][k]^1^block[get(i)][k].add]++;
			block[get(i)][k].sum[a[i][k]^block[get(i)][k].add]--;
			a[i][k]^=1ll;
		}
		return ;
	}
	for(int i=l;i<=to(get(l));i++){
		block[get(i)][k].sum[a[i][k]^1^block[get(i)][k].add]++;
		block[get(i)][k].sum[a[i][k]^block[get(i)][k].add]--;
		a[i][k]^=1ll;
	}
	for(int i=from(get(r));i<=r;i++){
		block[get(i)][k].sum[a[i][k]^1^block[get(i)][k].add]++;
		block[get(i)][k].sum[a[i][k]^block[get(i)][k].add]--;
		a[i][k]^=1ll;
	}
	for(int i=get(l)+1;i<=get(r)-1;i++){
		block[i][k].add^=1ll;
		swap(block[i][k].sum[0],block[i][k].sum[1]);
	}
	return ;
}
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	//for(int i=0;i<=10;i++){
	//	cout<<(4&(1<<i))<<endl;
	//}
	cin>>n;
	len=sqrt(n);
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		for(int j=0;j<=30;j++){
			a[i][j]=(x&(1<<j));
			block[get(i)][j].sum[a[i][j]]++;
		}
	}
	cin>>m;
	for(int i=1;i<=m;i++){
		int op,l,r,x;
		cin>>op>>l>>r;
		if(op==1){
			ans=0;
			for(int j=0;j<=30;j++){
				ans+=query(l,r,j)<<j;
			}
			cout<<ans<<endl;
		}
		else{
			cin>>x;
			for(int j=0;j<=30;j++){
				modify(l,r,j,x&(1<<j));
			}
		}
	}
	return 0;
}
2022/12/1 14:30
加载中...