正题

题目链接:https://www.luogu.com.cn/problem/P5607


题目大意

\(n\)个数字的序列,\(m\)次操作

  1. 区间\([l,r]\)异或上一个值\(v\)
  2. 询问区间\([l,r]\)中选出一些数来异或的最大异或和

解题思路

最大异或和的话只能是线性基了,但是线性基的区间修改又不能通过打标记的方法。

不能区间修改就转单点修改,我们定义一个序列\(b_i=a_i\ xor\ a_{i-1}\)。这样修改的时候就可以单点进行修改了。

但是这样好像会影响我们的查询操作,考虑查询区间\([l,r]\)的时候,我们会选出若干个前缀来进行操作,被异或多次的区间会抵消掉一些,如果选择了\(b_x\)就可以理解为选择了\(a_{x-1}\ xor\ a_{x}\)。

但是会发现\(b_{1\sim l}\)也就是\(a_l\)可能会被异或很多次,其实可以把\(b_{l+1\sim r}\cup a_l\)的线性基拿出来跑就是答案了。因为如果在\([l+1,r]\)这个范围无论选择了奇偶个都可以用\(a_l\)来决定前面区间的异或次数。

\(a_l\)的话我们再维护一个树状数组来查询就好了,注意一下细节就行了

时间复杂度\(O((n+m)\log n\log^2 w)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&-x)
using namespace std;
const int N=5e4+10;
struct xxj{
int d[32];
void init(){memset(d,0,sizeof(d));}
void Insert(int x){
for(int i=30;i>=0;i--)
if((x>>i)&1){
if(d[i])x^=d[i];
else{
d[i]=x;
return;
}
}
return;
}
int Query(int x){
for(int i=30;i>=0;i--)
if((x^d[i])>x)x^=d[i];
return x;
}
}c,w[N<<2],ans;
int n,m,a[N],t[N];
void Add(xxj &a,xxj &b){
for(int i=0;i<=30;i++)
if(b.d[i])a.Insert(b.d[i]);
return;
}
void Change(int x,int L,int R,int pos,int val){
if(L==R){w[x].init();a[L]^=val;w[x].Insert(a[L]);return;}
int mid=(L+R)>>1;
if(pos<=mid)Change(x*2,L,mid,pos,val);
else Change(x*2+1,mid+1,R,pos,val);
w[x]=w[x*2];Add(w[x],w[x*2+1]);
return;
}
void Ask(int x,int L,int R,int l,int r){
if(L==l&&R==r){Add(ans,w[x]);return;}
int mid=(L+R)>>1;
if(r<=mid)Ask(x*2,L,mid,l,r);
else if(l>mid)Ask(x*2+1,mid+1,R,l,r);
else Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r);
return;
}
void Change(int x,int val){
while(x<=n){
t[x]^=val;
x+=lowbit(x);
}
return;
}
int Ask(int x){
int ans=0;
while(x){
ans^=t[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=n;i>=1;i--){
int p=a[i]^a[i-1];a[i]=0;
Change(1,1,n,i,p);Change(i,p);
}
while(m--){
int op,l,r,x;
scanf("%d%d%d%d",&op,&l,&r,&x);
if(op==1){
Change(l,x);Change(r+1,x);
Change(1,1,n,l,x);
if(r<n)Change(1,1,n,r+1,x);
}
else{
ans.init();
if(l<r)Ask(1,1,n,l+1,r);
int mx=ans.Query(x);
mx=max(mx,ans.Query(x^Ask(l)));
printf("%d\n",mx);
}
}
return 0;
}

P5607-[Ynoi2013]无力回天NOI2017【线性基,线段树,树状数组】的更多相关文章

  1. 洛谷 P5607 [Ynoi2013] 无力回天 NOI2017

    人生第一道Ynoi,开心 Description https://www.luogu.com.cn/problem/P5607 Solution 拿到这个题,看了一下,发现询问要求最大异或和,怎么办? ...

  2. loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)

    题意 题目链接 Sol 线性基+线段树分治板子题.. 调起来有点自闭.. #include<bits/stdc++.h> #define fi first #define se secon ...

  3. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  4. ACM-ICPC 2017 Asia Xi'an A XOR (线性基+线段树思想)

    题目链接 题意;给个数组,每次询问一个区间你可以挑任意个数的数字异或和 然后在或上k的最大值 题解:线性基不知道的先看这个,一个线性基可以log的求最大值把对应去区间的线性基求出来然后用线段树维护线性 ...

  5. ACM-ICPC 2017 西安赛区现场赛 A. XOR(线性基+线段树)

    题目链接:https://nanti.jisuanke.com/t/20749 参考题解:https://blog.csdn.net/Lee_w_j__/article/details/8266418 ...

  6. CodeForces - 1100F:Ivan and Burgers (线性基&贪心)(离线 在线)

    题意:给定N个数,Q次询问,求区间最大异或和. 思路:一开始想的线性基+线段树.单次线性基合并的复杂度为20*20,结合线段树,复杂度为O(NlogN*20*20):显然,超时. 超时代码: #inc ...

  7. HDU - 3949 :XOR(线性基,所有集合的不同异或和中,求从小到大第K个)

    XOR is a kind of bit operator, we define that as follow: for two binary base number A and B, let C=A ...

  8. 前缀和线性基HDU6579

    Operation 题解:看到区间最大异或和,首先想到的是线性基: 线性基可以处理的操作是: 在数列末尾插入一个数 查询全局的子集异或最大值 由于线性基的长度很短,因此我们可以将数列所有前缀的线性基保 ...

  9. CodeForces -163E :e-Government (AC自动机+DFS序+树状数组)

    The best programmers of Embezzland compete to develop a part of the project called "e-Governmen ...

随机推荐

  1. MVVMLight学习笔记(七)---Messenger使用

    一.概述 Messenger中文解释为信使的意思,顾名思义,在MvvmLight中,它的主要作用是用于View和ViewModel.ViewModel和ViewModel之间的通信. 考虑以下场景: ...

  2. Javascript - Vue - 路由

    vue router.js 下载:vue-router.js, 该文件依赖于vue.js <script src="Scripts/vue-2.4.0.js">< ...

  3. 我说Java完全面向对象,老大过来就是一jio

    哈喽,大家好,我是指北君.自从开始学Java,就知道Java是一门面向对象编程的语言,所以在指北君眼中,Java就是完全面向对象的.有一天老大问到我这个事情,我脱口而出,结果老大过来就是一jio... ...

  4. centos6.10下安装mysql8.0.16root密码修改的坑

    上图截取别人的自己懒得弄,检查自己的linux是否有安装就按上图做就行了 接下来是我的干货 mysql8.0安群策略对密码设置很严格规则:大小写加数字和特殊字符串 使用yum安装mysql 后 my. ...

  5. 用C++实现的Eratosthenes筛法程序

    运行示例 只输出素数总数的运行示例 PS H:\Read\num\x64\Release> .\esieve.exe Eratosthenes sieve: a method to find o ...

  6. MySQL主从复制NEW

    1.复制配置     主机一定要开启二进制日志(这里建议配置RBR)     每个主机和每个从机一定要配置一个位移的id,即server-id     每个从机配置一定要包含主机名称,日志名称,和位置 ...

  7. CSS3 animaion 和 transition 比较

    animation是CSS3的动画属性,可以设置以下六种属性. transition是CSS3的过度属性,可以设置以下四种属性. 从属性上分析,animation可以设定循环次数. 其次,两者的触发条 ...

  8. spring boot 系列之七:SpringBoot整合Mybatis

    springboot已经很流行,但是它仍需要搭配一款ORM框架来实现数据的CRUD,之前已经分享过JdbcTemplete和JPA的整合,本次分享下Mybatis的整合. 对于mybatis的使用,需 ...

  9. Mybatis-Plus增强包

    简介 本框架(Gitee地址 )结合公司日常业务场景,对Mybatis-Plus 做了进一步的拓展封装,即保留MP原功能,又添加更多有用便捷的功能.具体拓展体现在数据自动填充(类似JPA中的审计).关 ...

  10. Python - 文件模式a+读取不了文件

    代码 f = open('test/gbk.txt', 'a+', encoding='utf-8') print(f.readline()) 最终的执行结果是输出空,为什么呢? a+模式打开文件指针 ...