关于刚刚结束的比赛
  • 板块灌水区
  • 楼主2024hyx
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/17 12:34
  • 上次更新2024/9/17 13:06:10
查看原帖
关于刚刚结束的比赛
1348260
2024hyx楼主2024/9/17 12:34

T4用bool空间炸了,换成bitset全wa,想问问bitset到底咋用

代码

#include<bits/stdc++.h>
#define N 200005
#define rd read()
#define gc getchar()
using namespace std;
const int mod=(1<<30);
bitset<1> a[31];
int m,n;
inline int read()
{
	int x=0,ss=1,s=gc;
	while(!isdigit(s)&&s!='-')s=gc;
	if(s=='-')ss*=-1,s=gc;
	while(isdigit(s))x=(x<<1)+(x<<3)+s-'0',s=gc;
	return ss*x;
}
bitset<1> lazy[31];
bitset<1> fir[31];
int f1[31][N<<2];
void pushup(int id,int mid,int k)
{
	fir[k][id]=fir[k][id<<1];
	if(fir[k][id<<1]==fir[k][id<<1|1])f1[k][id]=min(f1[k][id<<1],f1[k][id<<1|1]);
	else f1[k][id]=min(f1[k][id<<1],mid+1);
}
void init(int id,int l,int r,int k)
{
	if(l==r)
	{
		f1[k][id]=INT_MAX; 
		fir[k][id]=a[k][l];
		return;
	}
	int mid=l+r>>1;
	init(id<<1,l,mid,k);
	init(id<<1|1,mid+1,r,k);
	pushup(id,mid,k);
}
void pushdown(int id,int l,int r,int k)
{
	if(lazy[k][id]==1)
	{
		fir[k][id<<1]=fir[k][id<<1]^1;
		fir[k][id<<1|1]=fir[k][id<<1|1]^1;
		lazy[k][id<<1]=lazy[k][id<<1]^1;
		lazy[k][id<<1|1]=lazy[k][id<<1|1]^1;
		lazy[k][id]=0;
	}
}
void insert(int id,int l,int r,int x,int y,int k)
{
	if(l>=x&&r<=y)
	{
		fir[k][id]=fir[k][id]^1;
		lazy[k][id]=lazy[k][id]^1;
		return;
	}
	pushdown(id,l,r,k);
	int mid=l+r>>1;
	if(x<=mid)insert(id<<1,l,mid,x,y,k);
	if(y>mid)insert(id<<1|1,mid+1,r,x,y,k);
	pushup(id,mid,k);
}
int ask(int id,int l,int r,int x,int y,int k)
{
	if(l>=x&&r<=y)
	{
		if(fir[k][id])return l;
		else return f1[k][id];
	}
	pushdown(id,l,r,k);
	int mid=l+r>>1,ans=INT_MAX;
	if(x<=mid)ans=min(ans,ask(id<<1,l,mid,x,y,k));
	if(y>mid)ans=min(ans,ask(id<<1|1,mid+1,r,x,y,k));
	return ans;
}
signed main()
{
	n=rd,m=rd;
	for(int i=1;i<=n;i++)
	{
		int x=rd,pos=0;
		while(x)
		{
			if(x&1)a[pos][i]=1;
			x>>=1;
			pos++;
		}
	}
	for(int i=0;i<=29;i++)init(1,1,n,i);
	while(m--)
	{
		int op=rd,l=rd,r=rd;
		if(op==1)
		{
			int k=rd;
			for(int i=0;i<=29;i++)
			{
				if(k&1)insert(1,1,n,l,r,i);
				k>>=1;
			}
		}
		else
		{
			long long ans=0,mul=1;
			for(int i=0;i<=29;i++)
			{
				int pos=ask(1,1,n,l,r,i);
				if(pos<=r)(ans+=(r-pos+1)*mul)%=mod;
				mul<<=1;
			}
			cout<<ans<<'\n';
		}
	}
	return 0;
}
2024/9/17 12:34
加载中...