社区讨论
三只 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 条回复,欢迎继续交流。
正在加载回复...