[十二省联考2019]异或粽子 01trie
[十二省联考2019]异或粽子 01trie
链接
思路
首先求前k大的(xo[i]^xo[j])(i<j)。
考场上只想到01trie,不怎么会写可持久,就写了n个01trie,和直接sort一样、、
咳咳,官方题解是。
一个堆维护i为终点,可以取得位置为\([L,R]\)的最大值为val。
每次选最大的,然后将这个点分裂成两个:
i为终点,可以取得位置为\([L,x-1]\)的最大值为\(val_1\)。
i为终点,可以取得位置为\([x+1,R]\)的最大值为\(val_2\)。
具体咋维护,可持久01trie(他应该就是说的主席树,忘记啦)。
其实可以直接是直接记录当前应该取第几大,建立可持久化01trie
还有一种是把k*2,这样消去了大小限制,直接建立一颗01trie,在上面跑k大,最后除以2
对角线上是有重复的,但是你一定选不到呀,xor起来为0
错误
1.一个hello wrold居然跑10s,垃圾病毒防护天天扫我exe。
2.我居然不知道trie可以求第k大xor值,菜的一批、、、、
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 + 6;
ll read() {
ll x = 0, f = 1; char s = getchar();
for (; s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;
for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int n, k, cnt=1, num[N];
ll a[N];
struct node {
int ch[2], siz;
} e[N * 35];
priority_queue<pair<ll, int> > q;
void insert(ll x) {
int p = 1;
for (int i = 31; i >= 0; --i) {
bool T_T = x & (1LL << i);
e[p].siz++;
if (!e[p].ch[T_T])
e[p].ch[T_T] = ++cnt;
p = e[p].ch[T_T];
}
e[p].siz++;
}
ll k_th(ll x, int k) {
if (k > n)
return 0;
ll ans = 0;
int p = 1;
for (int i = 31; i >= 0; --i) {
bool T_T = x & (1LL << i);
if (e[e[p].ch[T_T ^ 1]].siz >= k)
ans = ans | (1LL << i), p = e[p].ch[T_T ^ 1];
else
k -= e[e[p].ch[T_T ^ 1]].siz, p = e[p].ch[T_T];
}
return ans;
}
int main() {
n = read(), k = read() * 2;
insert(0);
for (int i = 1; i <= n; ++i) a[i] = a[i - 1] ^ read(), insert(a[i]);
for (int i = 0; i <= n; ++i) q.push(make_pair(k_th(a[i],num[i]=1),i));
ll ans = 0;
while (k--) {
pair<ll, int> u = q.top();
q.pop();
ans += u.first;
u.first=k_th(a[u.second],++num[u.second]);
if(num[u.second]<n) q.push(u);
}
cout << ans / 2 << "\n";
return 0;
}
[十二省联考2019]异或粽子 01trie的更多相关文章
- [十二省联考2019]异或粽子——可持久化trie树+堆
题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...
- 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
[BZOJ5495][十二省联考2019]异或粽子(主席树,贪心) 题面 BZOJ 洛谷 题解 这不是送分题吗... 转异或前缀和,构建可持久化\(Trie\). 然后拿一个堆维护每次的最大值,每次如 ...
- 【简】题解 P5283 [十二省联考2019]异或粽子
传送门:P5283 [十二省联考2019]异或粽子 题目大意: 给一个长度为n的数列,找到异或和为前k大的区间,并求出这些区间的异或和的代数和. QWQ: 考试时想到了前缀异或 想到了对每个数按二进制 ...
- Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ...
- Luogu P5283 [十二省联考2019]异或粽子
感觉不是很难的一题,想了0.5h左右(思路歪了,不过想了一个大常数的两只\(\log\)做法233) 然后码+调了1h,除了一个SB的数组开小外基本上也没什么坑点 先讲一个先想到的方法,我们对于这种问 ...
- [十二省联考2019]异或粽子(堆+可持久化Trie)
前置芝士:可持久化Trie & 堆 类似于超级钢琴,我们用堆维护一个四元组\((st, l, r, pos)\)表示以\(st\)为起点,终点在\([l, r]\)内,里面的最大值的位置为\( ...
- Luogu5283 十二省联考2019异或粽子(trie/可持久化trie+堆)
做前缀异或和,用堆维护一个五元组(x,l,r,p,v),x为区间右端点的值,l~r为区间左端点的范围,p为x在l~r中最大异或和的位置,v为该最大异或和,每次从堆中取出v最大的元素,以p为界将其切成两 ...
- 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...
- [十二省联考2019]异或粽子 (可持久化01tire 堆)
/* 查询异或最大值的方法是前缀和一下, 在01trie上二分 那么我们可以对于n个位置每个地方先求出最大的数, 然后把n个信息扔到堆里, 当我们拿出某个位置的信息时, 将他去除当前最大后最大的信息插 ...
随机推荐
- 用servlet进行用户名和密码校验1
运行效果如下: 代码截图: 登陆网页: 显示网页: 网盘链接: 链接:https://pan.baidu.com/s/1g5XJ6y8u5R5Wt0Lkj9g9lg 提取码:bphb
- oracle04 约束,索引
约束(constraint)一.定义 为表的列添加一些约束,以满足用户的需求.在之后的DML(select,insert,update) 数据时,若不满足约束条件,则语句不能执行 注:可以为约束起别名 ...
- idea将maven项目打包成war包
1.单击红色方框处 2.在IDEA右侧出现maven project选项 3.单击maven project选项,出现Spring MVC Basic Feature菜单,选择 其中的Lifecycl ...
- NOIP2018 游记 QAQ
写在前面: 本人初三党.NOIP前两个月不好好停课搞信竞愣是要搞文化课.于是,期中考与NOIP一起凉凉[微笑] 本人写的第一篇NOIP游记,各位大佬们随便看一看就好 Day -n 初赛71,竟然跟wx ...
- SpringMVC Web项目升级为Springboot项目(一)
一.项目改为Springboot项目 1.将pom中所有spring相关依赖删除,添加spring-boot-starter及spring-boot-starter-web(项目中可能有其他sprin ...
- springboot读取application.properties中自定义配置
假设在application-xxx.properties中配置 user.name=yuhk 一.在Controller中读取 @Value("{$user.name}") pr ...
- [LintCode] 77. Longest common subsequences_ Medium tag: Dynamic Programming
Given two strings, find the longest common subsequence (LCS). Example Example 1: Input: "ABCD&q ...
- u盘安装centos7.6 最新版本
1,可以按照网上的教程,制作u盘启动 2,然后将u盘插入主机,最重要的是这一步,网上的说法基本上适用这个版本 进入到这个界面: 然后选择Install Centos 7,然后按e键,tab是不管用的 ...
- ACM-ICPC 2018 南京赛区网络预赛(A, J)
A 签到题 Alice, a student of grade 666, is thinking about an Olympian Math problem, but she feels so d ...
- 无序数组求第k大/第k小的数
根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: ...