题意

给你一个长度为 \(n\) 的整数序列 \(a_1, a_2, \ldots, a_n\),你需要实现以下两种操作,每个操作都可以用四个整数 \(opt\ l\ r\ v\) 来表示:

  • \(opt=1\) 时,代表把一个区间 \([l, r]\) 内的所有数都 \(xor\) 上 \(v\)。

  • \(opt=2\) 时, 查询一个区间 \([l, r]\) 内选任意个数(包括 \(0\) 个)数 \(xor\) 起来,这个值与 \(v\) 的最大 \(xor\) 和是多少。

分析

线段树维护下线性基就行了,区间修改的时候记录下线段树每个结点的修改量\(k​\),合并的时候再加进线性基

因为线性基是构造出的一组极大线性无关组,所以查询\((a_i~xor~k)(i∈[l,r])\)组成的线性基等价于查询\(k∪a_i(i∈[l,r])​\)

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define bug cout<<"--------------"<<endl
using namespace std;
typedef long long ll;
const double PI=acos(-1.0);
const double eps=1e-6;
const int inf=1e9;
const ll llf=1e18;
const int mod=1e9+7;
const int maxn=5e4+10;
struct ji{
int p[33],k;
void clear(){
memset(p,0,sizeof(p));
}
void insert(int x){
for(int i=30;i>=0;i--){
if(!((x>>i)&1)) continue;
if(p[i]) x^=p[i];
else{
p[i]=x;
break;
}
}
}
int qy(int x){
int ret=x;
for(int i=30;i>=0;i--) ret=max(ret^p[i],ret);
return ret;
}
};
int n,m;
int a[maxn],b[maxn],f[maxn],tag[maxn<<2];
ji tr[maxn<<2];
ji mer(ji a,ji b){
ji ret=a;
for(int i=30;i>=0;i--) if(b.p[i]) ret.insert(b.p[i]);
ret.insert(ret.k^b.k);
return ret;
}
void pushup(int p){
tr[p]=mer(tr[p<<1],tr[p<<1|1]);
}
void tag1(int p,int x){
tr[p].k^=x;
tag[p]^=x;
}
void pushdown(int p){
tag1(p<<1,tag[p]);
tag1(p<<1|1,tag[p]);
tag[p]=0;
}
void build(int l,int r,int p){
if(l==r){
scanf("%d",&tr[p].k);
return;
}
int mid=l+r>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
pushup(p);
}
void up(int dl,int dr,int l,int r,int p,int x){
if(l>=dl&&r<=dr){
tr[p].k^=x;
tag[p]^=x;
return;
}
pushdown(p);
int mid=l+r>>1;
if(dl<=mid) up(dl,dr,l,mid,p<<1,x);
if(dr>mid) up(dl,dr,mid+1,r,p<<1|1,x);
pushup(p);
}
ji ans;
void qy(int dl,int dr,int l,int r,int p){
if(l>=dl&&r<=dr){
ans=mer(ans,tr[p]);
return;
}
pushdown(p);
int mid=l+r>>1;
if(dl<=mid) qy(dl,dr,l,mid,p<<1);
if(dr>mid) qy(dl,dr,mid+1,r,p<<1|1);
}
int main(){
scanf("%d%d",&n,&m);
build(1,n,1);
while(m--){
int op,l,r,v;
scanf("%d%d%d%d",&op,&l,&r,&v);
if(op==1){
up(l,r,1,n,1,v);
}else{
ans.clear();
qy(l,r,1,n,1);
printf("%d\n",ans.qy(v));
}
}
return 0;
}

Comet OJ - Contest #3 D 可爱的菜菜子 线段树+线性基的更多相关文章

  1. Comet OJ - Contest #3 D可爱的菜菜子(线段树+线性基的合并)

    这题其实挺经典的,看到求异或最大,显然想到的是线性基,不过这怎么维护?当然区间有关的东西都可以上线段树,区间修改时记录每个点的修改量k,然后合并线性基时再加入线性基.因为线性基是求一组极大线性无关组, ...

  2. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  3. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  4. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  5. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  6. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  7. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  8. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  9. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)

    来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...

随机推荐

  1. 基于keepalived搭建mysql双主高可用

    目录 概述 环境准备 keepalived搭建 mysql搭建 mysql双主搭建 mysql双主高可用搭建 概述 传统(不借助中间件)的数据库主从搭建,如果主节点挂掉了,从节点只能读取无法写入,只能 ...

  2. Visual Studio高分屏下Winform界面变形

    现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者, 分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响 ...

  3. 学习笔记--三分法&秦九韶算法

    前言 其实也没什么好说的吧,三分法就是用来求一个单调函数的最值和满足最大值的\(x\),秦九韶算法就是在\(O(N)\)时间内求一个多项式值 怎么用 三分法使用--看这篇:https://www.cn ...

  4. element-ui中关闭对话框清空验证,清除form表单数据

    对于elementUI中对话框,点击对话框和关闭按钮 怎么清空验证,清空form表单,避免二次点击还会有 验证错误的提示.今天终于自己查资料解决了,分享给大家 1.首先在你的对话框 取消按钮 加一个c ...

  5. 第九章、import 和from ...import

    目录 第九章.import 和from ...import 一.import和 from ...import ... 二.import模块名 第九章.import 和from ...import 一. ...

  6. U盘加载速度慢的解决方法

    在日常的生活和工作中,我们经常用U盘存储一些文件和程序.然而,一些朋友发现U盘有时候在使用过程中的识别加载速度非常缓慢.是U盘出故障了吗?其实不尽然,下面就为大家分享一下如何快速解决U盘加载缓慢的方法 ...

  7. Java 基本的数据类型(8种)

    1.Java 基本的数据类型(8种) 整型:byte .short .int .long 浮点型:float .double 字符型:char 布尔型:boolean

  8. JavaScript在页面中的执行顺序(理解声明式函数与赋值式函数) 转载

    JavaScript在页面中的执行顺序 https://blog.csdn.net/superhoy/article/details/52946277 2016年10月27日 15:38:52 阅读数 ...

  9. ioping测试

    ioping 一个实时显示磁盘io延时的工具,以类似ping 的输出一样展示输出结果 常用参数: -c count stop after count requests. -i interval Set ...

  10. VM 下增加磁盘空间

    随着Linux虚拟机的不断使用,在VMware中经常遇到 预先装好的 linux 虚拟机的硬盘空间过小 的问题,造成很多软件不能安装, 而重新装一个,又挺麻烦.于是,上网搜了下关于 vmware 硬盘 ...