视频链接:G69 前缀线性基+贪心法 CF1100F Ivan and Burgers_哔哩哔哩_bilibili
Ivan and Burgers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
// 前缀线性基+贪心法 O(30*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=500005; int n,m,x,l,r; int p[N][31]; //前缀线性基 int pos[N][31]; //第i位的基对应数的位置 void insert(int x,int id){ for(int i=0;i<=30;i++){ //复制前一版 p[id][i]=p[id-1][i]; pos[id][i]=pos[id-1][i]; } int P=id; for(int i=30;i>=0;i--){ if(x>>i&1){ if(!p[id][i]){ //不存在则加入 p[id][i]=x; pos[id][i]=P; break; } // 存在则先交换,后异或 if(pos[id][i]<P) swap(p[id][i],x),swap(pos[id][i],P); x^=p[id][i]; } } } int query(int l,int r){ int ans=0; for(int i=30;i>=0;i--) if(pos[r][i]>=l)ans=max(ans,ans^p[r][i]); return ans; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&x); insert(x,i); } scanf("%d",&m); while(m--){ scanf("%d%d",&l,&r); printf("%d\n",query(l,r)); } }
// 前缀线性基+贪心法 O(30*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=500005; int n,m,x,l,r,a[N]; int p[N][31],pos[N][31]; void insert(int id,int p[],int pos[]){ int x=a[id]; for(int i=30;i>=0;i--){ if(x>>i&1){ if(!p[i]){ //不存在则加入 p[i]=x; pos[i]=id; break; } // 存在则先交换,后异或 if(pos[i]<id) swap(p[i],x),swap(pos[i],id); x^=p[i]; } } } int query(int l,int r){ int ans=0; for(int i=30;i>=0;i--) if(pos[r][i]>=l) ans=max(ans,ans^p[r][i]); return ans; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); for(int j=0;j<=30;j++) //复制基 p[i][j]=p[i-1][j],pos[i][j]=pos[i-1][j]; insert(i,p[i],pos[i]); //插入基 } scanf("%d",&m); while(m--){ scanf("%d%d",&l,&r); printf("%d\n",query(l,r)); } }
// 前缀线性基+贪心法 O(30*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=500005; int n,m,x,l,r; struct node{ int p[31],pos[31]; void insert(node A,int x,int id){ *this=A; //复制前一版 for(int i=30;i>=0;i--){ if(x>>i&1){ if(!p[i]){ //不存在则加入 p[i]=x; pos[i]=id; break; } // 存在则先交换,后异或 if(pos[i]<id) swap(p[i],x),swap(pos[i],id); x^=p[i]; } } } int query(int l){ int ans=0; for(int i=30;i>=0;i--) if(pos[i]>=l) ans=max(ans,ans^p[i]); return ans; } }a[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&x),a[i].insert(a[i-1],x,i); scanf("%d",&m); while(m--){ scanf("%d%d",&l,&r); printf("%d\n",a[r].query(l)); } }
标签:前缀,CF1100F,int,pos,Burgers,ans,Ivan,include,id From: https://www.cnblogs.com/dx123/p/18305887