#线性基,差分,线段树#洛谷 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 分析 ...
随机推荐
- python内置模块argparse的使用
官网文档 https://docs.python.org/3/howto/argparse.html # 简易教程 https://docs.python.org/3/library/argparse ...
- 【LeetCode字符串#extra】KMP巩固练习:旋转字符串、字符串轮转
旋转字符串 https://leetcode.cn/problems/rotate-string/ 给定两个字符串, s 和 goal.如果在若干次旋转操作之后,s 能变成 goal ,那么返回 tr ...
- 【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口
问题描述 App Service for Container. Docker Image 推送到ACR(向 Azure 容器注册表), 配置App Service并部署成功了.查看Docker日志( ...
- redis 安装的参考文章
redis 安装 : https://www.runoob.com/redis/redis-install.html
- SpringCloud Hystrix断路器的基本使用
官网资料: https://github.com/Netflix/Hystrix/wiki/How-To-Use 1. 服务雪崩 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系, ...
- C++中的不规则二维数组
技术背景 最近刚学习C++的一些编程技巧,对于一些相对比较陌生的问题,只能采取一些简单粗暴的方案来实现.就比如说,我们可以在Python中定义一个[[0,0,0],[1,2],[1,1,1],[3]] ...
- Python 初学者容易踩的坑
哈喽大家好,我是咸鱼. 今天咸鱼列出了一些大家在初学 Python 的时候容易踩的一些坑,看看你有没有中招过. 原文:https://www.bitecode.dev/p/unexpected-pyt ...
- 关于vue.js:iview-Bug-5114在iview的Poptip气泡提示内调用DatePicker出现遮挡或同时关闭窗口等冲突问题[转]
转自:https://lequ7.com/guan-yu-vuejsiviewbug5114-zai-iview-de-poptip-qi-pao-ti-shi-nei-diao-yong-datep ...
- TornadoFx的EventBus使用
原文地址:TornadoFx中的EventBus使用 | Stars-One的杂货小窝 这里默认各位都清楚EventBus的具体作用,稍微有点短,主要国家没有啥好补充的吧 1.定义事件 //接收事件首 ...
- Linux快速入门(八)效率工具(SSH)
环境 (1)Kali(源主机),IP:10.211.55.4/24 (2)Ubuntu(目标主机),IP:10.211.55.5/24 SSH OpenSSH用于在远程系统上安全的运行Shell,假设 ...