洛谷:P哥的桶(线段树 + 线性基)
题目背景
P哥在IOI取得了金牌,现在他开始找女朋友了!
题目描述
P哥现在有nn个桶,他们排成了一排,这些桶可以装下任意多个女朋友。每个女朋友有一个固定的颜值
P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面。我们用1\;k\;x1kx来表示P哥找了一个颜值为xx的女朋友,并且丢进了kk号桶里面
P哥每天晚上需要在特定的桶里面找一些女朋友观赏。我们用2\;l\;r2lr来表示P哥在ll号桶到rr号桶之间找女朋友。P哥希望观赏的女朋友颜值异或和尽可能大。
注意:P哥观赏完这些后会女朋友把它们物归原位
输入输出格式
输入格式:
第一行两个整数n,mn,m,依次表示P哥的操作次数、这组数据会涉及到的最大编号
接下来nn行,每行三个整数,表示操作。操作格式如题
输出格式:
对于每个观赏操作,输出P哥能观赏到的最大颜值异或和
输入输出样例
输入样例#1: 复制
5 3 1 1 2 1 2 3 1 3 4 2 1 2 2 1 3
输出样例#1: 复制
3 7
输入样例#2: 复制
11 10 2 6 9 1 9 1523456696 1 1 1818963290 2 6 7 1 1 102229226 2 1 9 2 3 7 1 5 34895532 1 1 1652480680 1 1 1477666032 2 1 10
输出样例#2: 复制
0 0 1818963290 0 1857442578
说明
对于20%的数据,满足n,m\leq 100n,m≤100
对于40%的数据,满足n,m\leq 1000n,m≤1000
另有20%的数据,所有询问满足l=1,r=ml=1,r=m
对于100%的数据,满足n,m\leq 5*10^4\;\;\;l\leq r\leq m\;\;\;k\leq m\;\;\;x\leq 2^{31}-1n,m≤5∗104l≤r≤mk≤mx≤231−1
题意:N个操作,第K个桶放一个X,查询L到R区间的桶任意数的异或最大值。
思路:线段树,每个节点维护区间的线性基,因为数据比较随机,所以判断线性基满了直接返回就能优化复杂度。
线性基:将一堆数(设最大值为MAX)压成log2(MAX)个数,可以求出它们异或的最大值,或者能否异或出某个数。
# include <bits/stdc++.h>
# define lson l,mid,id<<1
# define rson mid+1,r,id<<1|1
using namespace std;
typedef long long LL;
const int maxn = 5e4+30;
struct node{int bit[32], len;
}a[maxn<<2];
void fun(node &x, int val){if(x.len == 31) return;for(int i=30; ~i; --i){if(val&(1<<i)){if(x.bit[i] == 0){x.bit[i] = val;++x.len;break;}else val ^= x.bit[i];}}
}
void update(int pos, int val, int l, int r, int id){fun(a[id], val);if(l == r) return;int mid = l+r>>1;if(pos <= mid) update(pos, val, lson);else update(pos, val, rson);
}
node Merge(node x, node y){if(x.len == 31) return x;if(y.len == 31) return y;node tmp = x;for(int i=30; ~i; --i)if(y.bit[i])fun(tmp, y.bit[i]);return tmp;
}
node query(int L, int R, int l, int r, int id){if(L<=l && R>=r) return a[id];int mid = l+r>>1;if(R <= mid) return query(L, R, lson);else if(L > mid) return query(L, R, rson);else return Merge(query(L, R, lson), query(L, R, rson));
}
int main(){int n, m, op, x, y;scanf("%d%d",&n,&m);while(n--){scanf("%d%d%d",&op,&x,&y);if(op == 1) update(x, y, 1, m, 1);else{node tmp = query(x, y, 1, m, 1);int ans = 0;for(int i=30; ~i; --i)if((ans^tmp.bit[i]) > ans) ans ^= tmp.bit[i];printf("%d\n",ans);}}return 0;
}
洛谷:P哥的桶(线段树 + 线性基)相关推荐
- 洛谷P4839 P哥的桶 线段树+线性基
传送门 题意:N个操作,第K个桶放一个X,查询L到R区间的桶任意数的异或最大值. P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用 1 k x 来表示P哥找了一个颜值为x的女朋友,并且 ...
- 洛谷 P3373 【模板】线段树 2 题解
洛谷 P3373 [模板]线段树 2 题解 题面 题目链接:[戳这里](https://www.luogu.org/problemnew/show/P3373) 题目描述 输入输出格式 输入输出样例 ...
- 洛谷P4839 P哥的桶【线段树+线性基】
题目描述 P哥现在有n个桶,他们排成了一排,这些桶可以装下任意多个女朋友.每个女朋友有一个固定的颜值 P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用1kx来表示P哥找了一个颜值为x的 ...
- 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)
传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...
- 洛谷 P3372 【模板】线段树 1(线段树区间加区间找)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...
- 洛谷T44252 线索_分治线段树_思维题
分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...
- 洛谷P3588 [POI2015]PUS(线段树优化建图)
题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...
- [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)
5286: [Hnoi2018]转盘 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 15 Solved: 11 [Submit][Status][ ...
- 洛谷 P3372 【模板】线段树 1
文章目录 题目描述 输入格式 输出格式 输入输出样例 说明 [样例解释] AC的C++代码(结合注释理解) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上k. 求出某区间 ...
- 洛谷 P3373 【模板】线段树 2 解题报告
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...
最新文章
- Java 反射:框架设计的灵魂
- mysql pdo 查询一条数据_pdo mysql怎么输出第1条 第4条 第7条数据
- OpenFire、Spark、Smack介绍
- python官方-Python官方中文文档强势来袭
- python是个啥-初识python: 面向对象是个啥?
- 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )
- 在IIS上建立WAP网站的图文方法
- Python+Matplotlib制作动画
- python flask 大文件 下载_flask - python上传大文件到服务器报错
- Unix 下的 vim 如何使用系统剪贴板
- 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
- 由1 2 3 4可以组成多个十百 无重复的数字
- Java:日期类Date与Calendar
- 安装SQL2005后SQL Server Management Studio 没有出来的解决方案
- OCR文字识别,PDF格式转换
- echarts地图设置label引导线
- 想要艺术气质高逼格,不吹牛真的有捷径可走
- .ul>li 和 .ul li的区别
- java.io.UTFDataFormatException: encoded string too long: 270976 bytes
- 手机外接html显示器,华为MateBook怎么连接外接显示器/投影仪?