#线性基,差分,线段树#洛谷 5607 [Ynoi2013] 无力回天 NOI2017
分析
考虑区间修改比较难操作,将数组差分一下,转化成两次单点修改。
这样查询前缀的异或值就是该位置的异或值,线性基可以用线段树维护,
那么取出 \((l,r]\) 所在的线性基,再将 \(a[l]\) 扔入线性基查询最大异或值即可
因为如果要取出 \(a_x\) 实则就是取出 \(a_l\) xor \(b_{l+1}\) xor \(\dots\) xor \(b_x\)。
所以区间异或有时转化成差分加单点异或,维护区间线性基可以这样做。
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=50011;
int a[N],n,m;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct Vector_Space{
int re[30],now;
inline void BUILD(){memset(re,0,sizeof(re));}
inline void Insert(int x){
for (rr int i=29;~i;--i)
if ((x>>i)&1){
if (re[i]) x^=re[i];
else {re[i]=x; return;}
}
}
inline signed query(int x){
for (rr int i=29;~i;--i)
if ((x^re[i])>x) x^=re[i];
return x;
}
}w[N<<2];
inline Vector_Space Merge(Vector_Space A,Vector_Space B){
for (rr int i=29;~i;--i)
if (B.re[i]) A.Insert(B.re[i]);
A.now^=B.now;
return A;
}
inline void build(int k,int l,int r){
if (l==r) {w[k].Insert(w[k].now^=a[l]); return;}
rr int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
w[k]=Merge(w[k<<1],w[k<<1|1]);
}
inline void update(int k,int l,int r,int x,int y){
if (l==r) {w[k].BUILD(),w[k].Insert(w[k].now^=y); return;}
rr int mid=(l+r)>>1;
if (x<=mid) update(k<<1,l,mid,x,y);
else update(k<<1|1,mid+1,r,x,y);
w[k]=Merge(w[k<<1],w[k<<1|1]);
}
inline signed query(int k,int l,int r,int x){
if (l==r) return w[k].now;
rr int mid=(l+r)>>1;
if (x<=mid) return query(k<<1,l,mid,x);
else return query(k<<1|1,mid+1,r,x)^w[k<<1].now;//前缀xor
}
inline Vector_Space Query(int k,int l,int r,int x,int y){
if (l==x&&r==y) return w[k];
rr int mid=(l+r)>>1;
if (y<=mid) return Query(k<<1,l,mid,x,y);
else if (x>mid) return Query(k<<1|1,mid+1,r,x,y);
else return Merge(Query(k<<1,l,mid,x,mid),Query(k<<1|1,mid+1,r,mid+1,y));
}
signed main(){
n=iut(); m=iut();
for (rr int i=1;i<=n;++i) a[i]=iut();
for (rr int i=n;i>1;--i) a[i]^=a[i-1];
build(1,1,n);
for (rr int i=1;i<=m;++i){
rr int opt=iut(),l=iut(),r=iut(),x=iut();
if (opt==1){
update(1,1,n,l,x);
if (r<n) update(1,1,n,r+1,x);
}else{
rr int Al=query(1,1,n,l);
if (l==r) {print(x>(x^Al)?x:(x^Al)),putchar(10); continue;}
rr Vector_Space t=Query(1,1,n,l+1,r);
t.Insert(Al),print(t.query(x)),putchar(10);
}
}
return 0;
}
#线性基,差分,线段树#洛谷 5607 [Ynoi2013] 无力回天 NOI2017的更多相关文章
- CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)
题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...
- 洛谷 P5607 [Ynoi2013] 无力回天 NOI2017
人生第一道Ynoi,开心 Description https://www.luogu.com.cn/problem/P5607 Solution 拿到这个题,看了一下,发现询问要求最大异或和,怎么办? ...
- 【Luogu3733】[HAOI2017]八纵八横(线性基,线段树分治)
[Luogu3733][HAOI2017]八纵八横(线性基,线段树分治) 题面 洛谷 题解 看到求异或最大值显然就是线性基了,所以只需要把所有环给找出来丢进线性基里就行了. 然后线性基不资磁撤销?线段 ...
- bzoj 4184: shallot【线性基+时间线段树】
学到了线段树新姿势! 先离线读入,根据时间建一棵线段树,每个节点上开一个vector存这个区间内存在的数(使用map来记录每个数出现的一段时间),然后在线段树上dfs,到叶子节点就计算答案. 注意!! ...
- 线段树 洛谷P3932 浮游大陆的68号岛
P3932 浮游大陆的68号岛 题目描述 妖精仓库里生活着黄金妖精们,她们过着快乐,却随时准备着迎接死亡的生活. 换用更高尚的说法,是随时准备着为这个无药可救的世界献身. 然而孩子们的生活却总是无忧无 ...
- [线段树]洛谷P5278 算术天才⑨与等差数列
题目描述 算术天才⑨非常喜欢和等差数列玩耍. 有一天,他给了你一个长度为n的序列,其中第i个数为a[i]. 他想考考你,每次他会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k ...
- 区间连续长度的线段树——洛谷P2894 [USACO08FEB]酒店Hotel
https://www.luogu.org/problem/P2894 #include<cstdio> #include<iostream> using namespace ...
- 【bzoj5028】小Z的加油店 扩展裴蜀定理+差分+线段树
题目描述 给出 $n$ 个瓶子和无限的水,每个瓶子有一定的容量.每次你可以将一个瓶子装满水,或将A瓶子内的水倒入B瓶子中直到A倒空或B倒满.$m$ 次操作,每次给 $[l,r]$ 内的瓶子容量增加 $ ...
- [Luogu5327][ZJOI2019]语言(树上差分+线段树合并)
首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路 ...
- [BZOJ3307] 雨天的尾巴(树上差分+线段树合并)
[BZOJ3307] 雨天的尾巴(树上差分+线段树合并) 题面 给出一棵N个点的树,M次操作在链上加上某一种类别的物品,完成所有操作后,要求询问每个点上最多物品的类型. N, M≤100000 分析 ...
随机推荐
- maven引入本地jar不能打入部署包的问题解决
引入的三方依赖 jar 包, scope 为 system 的包 maven 默认是不打包进去的,需要加这个配置 在pom.xml文件中找到spring-boot-maven-plugin插件,添加如 ...
- tox运行报C901错误解决办法
# 报C901表示该函数太复杂! 解决办法 在函数上添加如下注释即可 # flake8: noqa: C901
- JVM-对象实例化
JVM-对象实例化 1.创建对象的方式 new:最常见的方式.Xxx的静态方法,XxxBuilder/XxxFactory的静态方法 Class的newInstance方法:反射的方式,只能调用空参的 ...
- 【LeetCode回溯算法#03】电话号码的字母组合(数字映射字母)
电话号码的字母组合 力扣题目链接(opens new window) 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任 ...
- 2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, “y下“和“y上“表示一条无限延伸的道路,“y下“表示这个道路的下限,“y上“表示这个道路的上限, 给定一批长方形,每一个长方形有(
2024-02-28:用go语言,有一个由x轴和y轴组成的坐标系, "y下"和"y上"表示一条无限延伸的道路,"y下"表示这个道路的下限,& ...
- 【Azure App Service】当App Service中使用系统标识无法获取Access Token时
问题描述 App Serive上的应用配置了系统标识(System Identity),通过系统标识获取到访问Key Vault资源的Access Token.但这次确遇见了无法获取到正常的Acces ...
- 【Azure 应用服务】VS2019发布应用到正在运行的App Service时失败问题的解决
问题描述 在VS 2019中配置号App Service的Publish Profile后,发布应用出现错误.根据VS 2019中的输出消息可知有文件正在运行中,无法被替换,所以发布失败. 问题解决 ...
- 【Azure Developer】Python 获取 Azure 中订阅(subscription)信息,包含ID, Name等
问题描述 在Azure AD中注册一个Applicaiton后,对其进行授权,能够查看所有订阅的ReadOnly权限,然后,是否可以同通过Python代码,在完成Authorization后(使用Cl ...
- Android---Android Studio项目目录结构分析.
1. .gradle 和.idea 这两个目录下放置的都是 Android Studio 自动生成的一些文件,我们无须关心,也不要去手 动编辑. 2. app 项目中的代码.资源等内容几乎都是放置在这 ...
- vue3在typescript下对props类型判断
使用vue3.0 对 props 进行复杂类型验证的时候,可以直接用 PropType 进行强制转换: callback: Function as PropType<()=>void> ...