HDU 6579"Operation"(在线线性基+贪心)

传送门

•题解

  参考CF1100F这道题,不同点是本题有个在尾部插入值得操作,并且只能用在线的线性基;

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mem(a,b) memset(a,b,sizeof(a))
 4 #define ll long long
 5 const int maxn=5e5+50;
 6 
 7 int n,m;
 8 int a[maxn<<1];
 9 int base[maxn<<1][40];
10 int p[maxn<<1][40];
11 
12 void Insert(int pos,int x,int k)
13 {
14     for(int i=30;i >= 0;--i)
15     {
16         if(x&(1<<i))
17         {
18             if(!base[k][i])
19             {
20                 base[k][i]=x;
21                 p[k][i]=pos;
22             }
23             else if(p[k][i] < pos)
24             {
25                 swap(p[k][i],pos);
26                 swap(base[k][i],x);
27             }
28             x ^= base[k][i];
29         }
30     }
31 }
32 int Max(int l,int r)
33 {
34     int ans=0;
35     for(int i=30;i >= 0;--i)
36         if(p[r][i] >= l)
37             ans=max(ans,ans^base[r][i]);
38     return ans;
39 }
40 void Solve()
41 {
42     for(int i=1;i <= n;++i)
43     {
44         memcpy(base[i],base[i-1],sizeof(base[i-1]));
45         memcpy(p[i],p[i-1],sizeof(p[i-1]));
46 
47         Insert(i,a[i],i);
48     }
49     int ans=0;
50 
51     while(m--)
52     {
53         int op;
54         scanf("%d",&op);
55         if(!op)
56         {
57             int l,r;
58             scanf("%d%d",&l,&r);
59 
60             l=(l^ans)%n+1;
61             r=(r^ans)%n+1;
62             if(l > r)
63                 swap(l,r);
64 
65             ans=Max(l,r);
66 
67             printf("%d\n",ans);
68         }
69         else
70         {
71             int x;
72             scanf("%d",&x);
73             a[++n]=x^ans;
74 
75             memcpy(base[n],base[n-1],sizeof(base[n-1]));
76             memcpy(p[n],p[n-1],sizeof(p[n-1]));
77 
78             Insert(n,a[n],n);
79         }
80     }
81 }
82 int main()
83 {
84 //    freopen("C:\\Users\\hyacinthLJP\\Desktop\\in&&out\\contest","r",stdin);
85     int T;
86     scanf("%d",&T);
87     while(T--)
88     {
89         scanf("%d%d",&n,&m);
90         for(int i=1;i <= n;++i)
91             scanf("%d",a+i);
92 
93         Solve();
94     }
95     return 0;
96 }
View Code

猜你喜欢

转载自www.cnblogs.com/violet-acmer/p/11354952.html