TLE求助
查看原帖
TLE求助
428358
Grisses楼主2025/1/18 20:17

rt

用的是 zak 今天上午讲的方法,但是不知道是哪里写假了要跑 6s。

如果是我上课没听懂欢迎来骂我。

#include<bits/stdc++.h>
#define lc (mid<<1)
#define rc (mid<<1|1)
//#define int long long
using namespace std;
char buf[1000005],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin))?EOF:*p1++)
int read(){
	int x=0,c=gc();
	while(!isdigit(c))c=gc();
	while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=gc();
	return x;
}
int n,q,a[50005];
mt19937 Rand(time(0));
struct ST{
	struct Node{
		int l,r;
		int p,val;
		bool sum;
	}c[100005];
	void Build(int q,int l,int r){
		c[q].l=l;c[q].r=r;
		c[q].p=0;
		if(l==r){
			c[q].sum=Rand()%2;
			c[q].val=a[l]*c[q].sum;
			return;
		}
		int mid=l+r>>1;
		Build(lc,l,mid);
		Build(rc,mid+1,r);
		c[q].sum=c[lc].sum^c[rc].sum;
		c[q].val=c[lc].val^c[rc].val;
	}
	void xr(int q,int x){
		c[q].p^=x;
		if(c[q].sum&1)c[q].val^=x;
	}
	void down(int q){
		if(c[q].p){
			int mid=c[q].l+c[q].r>>1;
			xr(lc,c[q].p);
			xr(rc,c[q].p);
			c[q].p=0;
		}
	}
	void Xor(int q,int l,int r,int x){
		if(l<=c[q].l&&c[q].r<=r){
			xr(q,x);
			return;
		}
		down(q);
		int mid=c[q].l+c[q].r>>1;
		if(l<=mid)Xor(lc,l,r,x);
		if(mid<r)Xor(rc,l,r,x);
		c[q].val=c[lc].val^c[rc].val;
	}
	int Get(int q,int l,int r){
		if(l<=c[q].l&&c[q].r<=r)return c[q].val;
		down(q);
		int mid=c[q].l+c[q].r>>1,res=0;
		if(l<=mid)res^=Get(lc,l,r);
		if(mid<r)res^=Get(rc,l,r);
		return res;
	}
}T[65];
int base[35];
void Insert(int x){
	for(int i=30;i>=0;i--){
		if(x>>i&1){
			if(!base[i]){
				base[i]=x;
				return;
			}
			x^=base[i];
		}
	}
}
int Get(int x){
	int res=x;
	for(int i=30;i>=0;i--){
		if(base[i]&&!(res>>i&1))res^=base[i];
	}
	return res;
}
signed main()
{
//	freopen("data.in","r",stdin);
//	freopen("data.out","w",stdout);
	n=read(),q=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1;i<=50;i++)T[i].Build(1,1,n);
	while(q--){
		int op,l,r,x;
		op=read(),l=read(),r=read(),x=read();
		if(op==1){
			for(int i=1;i<=60;i++)T[i].Xor(1,l,r,x);
		}
		else{
			for(int i=0;i<=30;i++)base[i]=0;
			for(int i=1;i<=60;i++)Insert(T[i].Get(1,l,r));
			printf("%d\n",Get(x));
		}
	}
	return 0;
}
2025/1/18 20:17
加载中...