BZOJ 3689: 异或之
字典树可以$o(logn)查找第k大$
使用$可持久化Trie 区间查找第k大,然后首先把每个数异或之后的最小丢进小根堆中,然后一个一个取出,取出后就再丢次小,一共取k次$
总的时间复杂度为$O(klogn)$
本来的考虑是 先找出第k大,然后在$Trie上DFS把小于这个数的全丢进vector 然后发现会有很多无用状态会搜索到,T掉$
- #include <bits/stdc++.h>
- using namespace std;
- #define N 100010
- int n, k, arr[N], kth;
- struct node
- {
- int base, num, pos, l, r;
- node () {}
- node (int base, int num, int pos, int l, int r) : base(base), num(num), pos(pos), l(l), r(r) {}
- bool operator < (const node &r) const { return num > r.num; }
- };
- priority_queue <node> q;
- namespace TRIE
- {
- int rt[N], cnt;
- struct node
- {
- int son[], cnt;
- }a[N * ];
- void init()
- {
- a[].son[] = a[].son[] = a[].cnt = ;
- cnt = ;
- }
- void insert(int &now, int pre, int x)
- {
- now = ++cnt;
- a[now] = a[pre];
- int root = now; ++a[root].cnt;
- for (int i = ; i >= ; --i)
- {
- int id = (x >> i) & ;
- a[++cnt] = a[a[root].son[id]];
- ++a[cnt].cnt;
- a[root].son[id] = cnt;
- root = cnt;
- }
- }
- int find_kth(int x, int k, int l, int r)
- {
- int res = ;
- int tl = rt[l], tr = rt[r];
- for (int s = ; s >= ; --s)
- {
- int id = (x >> s) & ;
- int sum = a[a[tr].son[id]].cnt - a[a[tl].son[id]].cnt;
- if (sum < k)
- {
- k -= sum;
- res |= << s;
- tr = a[tr].son[id ^ ];
- tl = a[tl].son[id ^ ];
- }
- else
- {
- tr = a[tr].son[id];
- tl = a[tl].son[id];
- }
- }
- return res;
- }
- }
- int main()
- {
- while (scanf("%d%d", &n, &k) != EOF)
- {
- for (int i = ; i <= n; ++i) scanf("%d", arr + i);
- TRIE::init();
- for (int i = ; i <= n; ++i) TRIE::insert(TRIE::rt[i], TRIE::rt[i - ], arr[i]);
- for (int i = ; i < n; ++i) q.push(node(arr[i], TRIE::find_kth(arr[i], , i, n), , i, n));
- for (int i = ; i <= k; ++i)
- {
- node top = q.top(); q.pop();
- printf("%d%c", top.num, " \n"[i == k]);
- q.push(node(top.base, TRIE::find_kth(top.base, top.pos, top.l, top.r), top.pos + , top.l, top.r));
- }
- }
- return ;
- }
BZOJ 3689: 异或之的更多相关文章
- bzoj 3689: 异或之 Trie+堆
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3689 题解: 利用一个优先队列存储当前取到的数 然后再写一颗支持查找异或的k大值的Tri ...
- BZOJ 3689 异或 Trie木+堆
标题效果:特定n的数量,这种需求n数22 XOR的值前者k少 首先,我们建立了一个二进制的所有数字Trie木,您可以使用Trie木size域检查出一些其他的数字XOR值首先k少 然后,我们要保持一个堆 ...
- BZOJ 3689 异或之 (可持久化01Trie+堆)
题目大意:给你一个序列,求出第$K$大的两两异或值 先建出来可持久化$01Trie$ 用一个$set$/堆存结构体,存某个异或对$<i,j>$的第二关键字$j$,以及$ai\;xor\;a ...
- BZOJ 3689: 异或之 可持久化trie+堆
和超级钢琴几乎是同一道题吧... code: #include <bits/stdc++.h> #define N 200006 #define ll long long #define ...
- 异或之(bzoj 3689)
Description 给定n个非负整数A[1], A[2], --, A[n].对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这 ...
- [BZOJ 4671]异或图
Description 题库链接 给定 \(s\) 个结点数相同且为 \(n\) 的图 \(G_1\sim G_s\) ,设 \(S = \{G_1, G_2,\cdots , G_s\}\) ,问 ...
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- bzoj 2466 异或方程组
对于每个灯,我们用一个变量表示其决策,xu=0表示不选,xu=1表示选.因为每个灯最后必须都亮,所以每个等都对应一个异或方程. 解这个异或方程组,有几种情况: 1.存在唯一解(得到的上三角系数矩阵的主 ...
- bzoj 4671 异或图——容斥+斯特林反演+线性基
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4671 考虑计算不是连通图的方案,乘上容斥系数来进行容斥. 可以枚举子集划分(复杂度是O(Be ...
随机推荐
- 亿级日PV的魅族云同步的核心协议与架构实践
声明:本文根据msup和魅族联合举办的<第三期魅族技术开放日-架构设计与优化>录音整理原创首发,转载或节选内容前需获授权. 嘉宾:沈辉煌,魅族高级架构师,魅族云同步负责人.2010年加入魅 ...
- eclipse 下安装 lombok.jar
lombok是一个java 开发插件,可以用来简化代码, 1. 下载lombok.jar https://projectlombok.org/download 2 将lombok.jar文件放在ecl ...
- Wise 打包细节
细节 说明 添加卸载快捷方式 缺省的安装程序快捷方式中没有卸载项:只能通过控制面板删除,或者主程序目录下的UnWise.exe来卸载.实际上,该文件就可以作为卸载程序. 可以复制一个快捷方式,将程序名 ...
- WPF MVVM(Caliburn.Micro) 数据验证
书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model端验证,Model通过继承IDataErrorInfo接口来 ...
- plsql类型
--plsql基本数据类型1.标量类型1.1数字型--BINARY_INTEGER 来存储有符号整数.它的范围是-2**31至2**31.跟PLS_INTEGER一样,BINARY_INTEGER所需 ...
- DBUtils结果集处理
1.BeanHandler查询 package jdbc; import java.sql.Connection; import java.sql.SQLException; import org.a ...
- ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
今天第一次遇到Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误,并且在错误提示的后半段出现了 ...
- django 之 常用命令
Django 基本命令 本节主要是为了让您了解一些django最基本的命令,请尝试着记住它们,并且多多练习下 1. 新建一个 django project django-admin.py startp ...
- border-radius 原理分析
border-radius 想必大家都有所了解,比较常见的用法就像下面一样: 注意左边的盒子 border-radius: 100px; 右边的为0哦,所以右边的实际上没有设置圆角边框属性:咱们比较 ...
- c# Log4net的结构
log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).