[十二省联考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个信息扔到堆里, 当我们拿出某个位置的信息时, 将他去除当前最大后最大的信息插 ...
随机推荐
- 实验八 Web基础 SQL注入原理
实验八 Web基础 实验要求 (1)Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2)Web前端javascipt ...
- http类中的download方法 下载汉字文件名 汉字消失的问题
将文件名用urlencode转码即可 $http = new \Org\Net\Http; $http->download($fileName, urlencode($showName));
- C# 按不同的字节编码,通过字节数去截取字符串
/// <summary> /// 按不同的字节编码,通过字节数去截取字符串 /// 数据库UTF-8 1个数字.字母.英文符号算1个长度 1个中文.中文符号算3个长度 /// </ ...
- FB面经Prepare: Merge K sorted Array
Merge K sorted Array 跟Merge K sorted lists不同在于,从PQ里poll出来以后不知道下一个需要被加入PQ的是哪一个 所以需要写一个wrapper class p ...
- python练习--利用while循环和if语句,完成猜骰子的数字大小
#exampleimport random# 骰子投掷的随机叔numnum = random.randint(1,6)# 输入一个猜测的数字temp = input("请输入一个整数:&qu ...
- C#中的as关键字
你能进到这篇文章…… 首先你可能明白类似于 double num=0;int m=(int) num; 或者你明白 int m=209;String str=m.toString();或者说你甚至见过 ...
- Centos7 安装tomcat
- 利用Team@OSC进行团队协作开发平台
利用Team@OSC进行团队协作开发平台 Team@OSC介绍 Team@OSC 是一个团队协作开发平台,轻松管理轻量级团队.代码运行平台(PaaS).代码质量检查应有尽有. 链接:https://t ...
- svn与cvs的一些比较
所有的文档都显示SVN可以取代CVS,同时SVN的问题和缺点都被隐藏了.不幸的是,我们并不认为SVN是CVS的替代品,尽管很多缺陷都被修改了.更有甚者,它甚至让人重回VSS.CVS和SVN的比较类似与 ...
- spring-boot集成activiti的model遇到问题汇总
按照网上的七拼八凑整合网页版的部署将遇到的问题归置如下: 本人的springboot版本是:1.5.13.RELEASE 工作流相关: <!--工作流--> <dependency& ...