HDOJ6579Operation(线性基)

Posted myx12345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ6579Operation(线性基)相关的知识,希望对你有一定的参考价值。

题意:给定一个数列a,给定两种操作:

1.询问[l,r]区间内最大的xor和

2.n++,a[n]赋值为x

要求强制在线

n,m<=5e5,a[i]<2^30

思路:同CF1100F

固定右端点,维护每一维上使生成空间变大的最大的左端点

技术图片

 

 

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 typedef unsigned int uint;
  5 typedef unsigned long long ull;
  6 typedef pair<int,int> PII;
  7 typedef pair<ll,ll> Pll;
  8 typedef vector<int> VI;
  9 typedef vector<PII> VII;
 10 typedef pair<ll,int>P;
 11 #define N  1100000
 12 #define M  151000
 13 #define fi first
 14 #define se second
 15 #define MP make_pair
 16 #define pi acos(-1)
 17 #define mem(a,b) memset(a,b,sizeof(a))
 18 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
 19 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
 20 #define lowbit(x) x&(-x)
 21 #define Rand (rand()*(1<<16)+rand())
 22 #define id(x) ((x)<=B?(x):m-n/(x)+1)
 23 #define ls p<<1
 24 #define rs p<<1|1
 25 
 26 const ll MOD=1e9+7,inv2=(MOD+1)/2;
 27       double eps=1e-6;
 28       ll INF=1e18;
 29       ll inf=5e13;
 30       int dx[4]=-1,1,0,0;
 31       int dy[4]=0,0,-1,1;
 32 
 33 int f[N][31],g[N][31],a[N];
 34 
 35 int read()
 36 
 37    int v=0,f=1;
 38    char c=getchar();
 39    while(c<48||57<c) if(c==-) f=-1; c=getchar();
 40    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
 41    return v*f;
 42 
 43 
 44 void add(int i,int x)
 45 
 46     int k=i;
 47     per(j,30,0) f[i][j]=f[i-1][j],g[i][j]=g[i-1][j];
 48     per(j,30,0)
 49      if(x>>j)
 50      
 51          if(!f[i][j])
 52          
 53              f[i][j]=x;
 54              g[i][j]=k;
 55              break;
 56          
 57           else
 58           
 59               if(k>g[i][j])
 60               
 61                   swap(k,g[i][j]);
 62                   swap(x,f[i][j]);
 63               
 64               x^=f[i][j];
 65           
 66      
 67 
 68 
 69 int main()
 70 
 71     //freopen("1.in","r",stdin);
 72     //freopen("1.out","w",stdout);
 73     int cas=read();
 74     while(cas--)
 75     
 76         int n=read(),m=read();
 77         rep(i,1,n)
 78          rep(j,0,30) f[i][j]=g[i][j]=0;
 79         int lastans=0;
 80         rep(i,1,n)
 81         
 82             a[i]=read();
 83             add(i,a[i]);
 84         
 85 
 86         while(m--)
 87         
 88             int op=read();
 89             if(op)
 90             
 91                 a[++n]=read()^lastans;
 92                 add(n,a[n]);
 93             
 94              else
 95              
 96                  int l=read(),r=read();
 97                  l=(l^lastans)%n+1,r=(r^lastans)%n+1;
 98                  if(l>r) swap(l,r);
 99                  lastans=0;
100                  per(i,30,0)
101                   if((lastans^f[r][i])>lastans&&g[r][i]>=l) lastans^=f[r][i];
102                  printf("%d\\n",lastans);
103              
104         
105 
106     
107 
108 
109 
110 
111     return 0;
112 

 

以上是关于HDOJ6579Operation(线性基)的主要内容,如果未能解决你的问题,请参考以下文章

2019杭电多校第一场 Operation HDU - 6579

HDU6579 Operation

hdu-6579 Operation

HDU 6579 Operation

2019 杭电多校 第一场

2019 Multi-University Training Contest 1