社区讨论

三只 log是否可行?

P11620[Ynoi Easy Round 2025] TEST_34参与者 13已保存回复 19

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
19 条
当前快照
1 份
快照标识符
@mm1fr779
此快照首次捕获于
2026/02/25 10:49
2 周前
此快照最后确认于
2026/02/25 11:50
2 周前
查看原帖
T 飞了。
是不是应该换种做法?
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5;
struct nd{
	int s[32];
	void ins(int x){
		for(int i=30;i>=0;i--){
			if((x>>i)&1){
				if(s[i]==0){
					s[i]=x;
					return;
				}
				else{
					x^=s[i];
				}
			}
		}
	}
	int que(int x){
		for(int i=30;i>=0;i--){
			if((x^s[i])>x){
				x^=s[i];
			}
		}
		return x;
	}
	nd operator+(const nd &t)const{
		nd res=*this;
		for(int i=30;i>=0;i--){
			res.ins(t.s[i]);
		}
		return res;
	}
};
struct sgt{
	#define mid ((le+ri)>>1)
	#define ls (u<<1)
	#define rs ((u<<1)|1)
	#define lp ls,le,mid
	#define rp rs,mid+1,ri
	nd s[N<<2];
	void push_up(int u){
		s[u]=s[ls]+s[rs];
	}
	void upd(int u,int le,int ri,int x,int k){
		if(le==ri){
			s[u]=nd();
			s[u].ins(k);
			return;
		}
		if(x<=mid) upd(lp,x,k);
		else upd(rp,x,k);
		push_up(u);
	}
	nd que(int u,int le,int ri,int x,int y){
		if(x<=le&&ri<=y){
			return s[u];
		}
		nd res{};
		if(x<=mid) res=res+que(lp,x,y);
		if(y>mid) res=res+que(rp,x,y);
		return res;
	}
}t1;
struct bt{
	int s[N];
	int lowbit(int x){
		return x&(-x);
	}
	void upd(int x,int k){
		while(x<N){
			s[x]^=k;
			x+=lowbit(x);
		}
	}
	int que(int x){
		int res=0;
		while(x){
			res^=s[x];
			x-=lowbit(x);
		}
		return res;
	}
}t2;
int n,q,a[N];
void ch(int x,int k){
	t2.upd(x,k);
	int val=t2.que(x)^t2.que(x-1);
	t1.upd(1,1,n,x,val);
}
void upd(int l,int r,int k){
	ch(l,k);
	if(r!=n) ch(r+1,k);
}
int que(int l,int r,int k){
	int w=t2.que(l);
	nd res{};
	if(l<r) res=t1.que(1,1,n,l+1,r);
	res.ins(w);
	return res.que(k);
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		upd(i,i,a[i]);
	}
	while(q--){
		int op,l,r,k;
		cin>>op>>l>>r>>k;
		if(op==1){
			upd(l,r,k);
		}
		else{
			cout<<que(l,r,k)<<"\n";
		}
	}
}

回复

19 条回复,欢迎继续交流。

正在加载回复...