题目背景

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哥的桶(线段树 + 线性基)相关推荐

  1. 洛谷P4839 P哥的桶 线段树+线性基

    传送门 题意:N个操作,第K个桶放一个X,查询L到R区间的桶任意数的异或最大值. P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用 1 k x 来表示P哥找了一个颜值为x的女朋友,并且 ...

  2. 洛谷 P3373 【模板】线段树 2 题解

    洛谷 P3373 [模板]线段树 2 题解 题面 题目链接:[戳这里](https://www.luogu.org/problemnew/show/P3373) 题目描述 输入输出格式 输入输出样例 ...

  3. 洛谷P4839 P哥的桶【线段树+线性基】

    题目描述 P哥现在有n个桶,他们排成了一排,这些桶可以装下任意多个女朋友.每个女朋友有一个固定的颜值 P哥时不时地会找新女朋友,并把新找的女朋友丢进某个桶里面.我们用1kx来表示P哥找了一个颜值为x的 ...

  4. 洛谷P2221 [HAOI2012]高速公路(线段树+概率期望)

    传送门 首先,答案等于$$ans=\sum_{i=l}^r\sum_{j=i}^r\frac{sum(i,j)}{C_{r-l+1}^2}$$ 也就是说所有情况的和除以总的情况数 因为这是一条链,我们 ...

  5. 洛谷 P3372 【模板】线段树 1(线段树区间加区间找)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...

  6. 洛谷T44252 线索_分治线段树_思维题

    分治线段树,其实就是将标记永久化,到最后再统一下传所有标记. 至于先后顺序,可以给每个节点开一个时间戳. 一般地,分治线段树用于离线,只查询一次答案的题目. 本题中,标记要被下传 222 次. Cod ...

  7. 洛谷P3588 [POI2015]PUS(线段树优化建图)

    题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...

  8. [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)

    5286: [Hnoi2018]转盘 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 15  Solved: 11 [Submit][Status][ ...

  9. 洛谷 P3372 【模板】线段树 1

    文章目录 题目描述 输入格式 输出格式 输入输出样例 说明 [样例解释] AC的C++代码(结合注释理解) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上k. 求出某区间 ...

  10. 洛谷 P3373 【模板】线段树 2 解题报告

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...

最新文章

  1. Java 反射:框架设计的灵魂
  2. mysql pdo 查询一条数据_pdo mysql怎么输出第1条 第4条 第7条数据
  3. OpenFire、Spark、Smack介绍
  4. python官方-Python官方中文文档强势来袭
  5. python是个啥-初识python: 面向对象是个啥?
  6. 【Android 高性能音频】AAudio 音频流 PCM 采样 的 采样 缓冲 播放 的 连续机制 ( 数据回调机制 | 数据回调函数指针 | 实现数据回调函数 | 设置数据回调函数 )
  7. 在IIS上建立WAP网站的图文方法
  8. Python+Matplotlib制作动画
  9. python flask 大文件 下载_flask - python上传大文件到服务器报错
  10. Unix 下的 vim 如何使用系统剪贴板
  11. 删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏
  12. 由1 2 3 4可以组成多个十百 无重复的数字
  13. Java:日期类Date与Calendar
  14. 安装SQL2005后SQL Server Management Studio 没有出来的解决方案
  15. OCR文字识别,PDF格式转换
  16. echarts地图设置label引导线
  17. 想要艺术气质高逼格,不吹牛真的有捷径可走
  18. .ul>li 和 .ul li的区别
  19. java.io.UTFDataFormatException: encoded string too long: 270976 bytes
  20. 手机外接html显示器,华为MateBook怎么连接外接显示器/投影仪?

热门文章

  1. IP地址管理(IPAM)解决方案有哪些?
  2. 應電鍍廠要求把5個ITEM的主單位PRIMARY UOM由L改為KG
  3. (华为社招岗位,部门---上海海思,GTS,海思,2012,华为云):北京北京北京!
  4. Linux——Linux系统编程之基于TFTP实现服务器与开发板间的文件传输实战总结
  5. Android应用性能剖析全攻略
  6. 人工智能-语音交互-NLP自然语言(三) 语法-敲黑板
  7. 03_跳转sucess方法和error方法
  8. C#WinForm中的太空侵略者
  9. 【Godot】组合键的实现
  10. 佛祖释迦牟尼说的最经典的一句话