题目链接

【洛谷传送门】
【LOJ传送门】

题目大意

让你求区间异或和前\(k\)大的异或和的和。

正解

这道题目是Blue sky大佬教我做的(祝贺bluesky大佬进HA省A队)
我们做过某一些题目,非常的相似。【超级钢琴】还有【最小函数值】还有【最大异或和】
感觉这一些题目拼在一起就变成了这一道水题。
首先我们需要预处理出,所有区间的异或最大值。
这个东西可以用可持久化\(01trie\)实现,那么我们思考一下如何实现查询第\(k\)大的值的操作。

以下是关于01字典树中查询第k大的操作的讲解

可以参考平衡树和01trie贪心的策略。
因为我们是找到当前的子节点的另外一个。
因为从高位开始贪心,所以如果不相同则一定是比我们要求的答案要大,那么就减去这一部分,并且调到另外一个儿子上。
代码实现

  1. ll query(int rt, ll val, int kth, int len) {
  2. ll res = 0;
  3. for (int i = len; ~i; i --) {
  4. int p = (val >> i) & 1;
  5. if (cnt[ch[rt][p ^ 1]] < kth) kth -= cnt[ch[rt][p ^ 1]], rt = ch[rt][p];
  6. else res += (1ll << i), rt = ch[rt][p ^ 1];
  7. }
  8. return res;
  9. }

那么维护以每一个节点为结束的区间异或最大值。


那么回归正题,参照最小函数值和超级钢琴的思路,我们就每一次取出最大值之后,将这个区间次大值拎出来,放入优先队列中。
运行k遍就是我们需要的答案了。

  1. #include <bits/stdc++.h>
  2. #define ms(a, b) memset(a, b, sizeof(a))
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define ms(a, b) memset(a, b, sizeof(a))
  6. #define inf 0x3f3f3f3f
  7. #define db double
  8. #define Pi acos(-1)
  9. #define eps 1e-8
  10. #define N 600005
  11. using namespace std;
  12. template <typename T> T power(T x, T y, T mod) { x %= mod; T res = 1; for (; y; y >>= 1) { if (y & 1) res = (res * x) % mod; x = (x * x) % mod; } return res; }
  13. template <typename T> void read(T &x) {
  14. x = 0; T fl = 1; char ch = 0;
  15. for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') fl = -1;
  16. for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
  17. x *= fl;
  18. }
  19. template <typename T> void write(T x) {
  20. if (x < 0) x = -x, putchar('-');
  21. if (x > 9) write(x / 10); putchar(x % 10 + '0');
  22. }
  23. template <typename T> void writeln(T x) { write(x); puts(""); }
  24. struct node {
  25. ll val; int id;
  26. node(ll Val = 0, int Id = 0) { val = Val; id = Id; }
  27. bool operator < (const node &B) const { return val < B.val; }
  28. };
  29. priority_queue<node> q;
  30. struct L_Trie {
  31. int ch[N * 40][2], cnt[N * 40], tot;
  32. void ins(int &rt, int pre, ll val, int len) {
  33. rt = ++ tot; int k = rt;
  34. for (int i = len; ~i; i --) {
  35. ch[k][0] = ch[pre][0]; ch[k][1] = ch[pre][1]; cnt[k] = cnt[pre] + 1;
  36. int p = (val >> i) & 1;
  37. ch[k][p] = ++ tot;
  38. k = ch[k][p]; pre = ch[pre][p];
  39. }
  40. cnt[k] = cnt[pre] + 1;
  41. }
  42. ll query(int rt, ll val, int kth, int len) {
  43. ll res = 0;
  44. for (int i = len; ~i; i --) {
  45. int p = (val >> i) & 1;
  46. if (cnt[ch[rt][p ^ 1]] < kth) kth -= cnt[ch[rt][p ^ 1]], rt = ch[rt][p];
  47. else res += (1ll << i), rt = ch[rt][p ^ 1];
  48. }
  49. return res;
  50. }
  51. } trie;
  52. int root[N], kth[N];
  53. ll sumxor[N], a[N];
  54. int n, k;
  55. ll ans;
  56. int main() {
  57. read(n); read(k);
  58. trie.ins(root[0], 0, 0, 31);
  59. for (int i = 1; i <= n; i ++) {
  60. kth[i] = 1; read(a[i]);
  61. sumxor[i] = sumxor[i - 1] ^ a[i];
  62. trie.ins(root[i], root[i - 1], sumxor[i], 31);
  63. q.push(node(trie.query(root[i - 1], sumxor[i], kth[i], 31), i));
  64. }
  65. while (k --) {
  66. node cur = q.top(); q.pop();
  67. ans += cur.val; kth[cur.id] ++;
  68. q.push(node(trie.query(root[cur.id - 1], sumxor[cur.id], kth[cur.id], 31), cur.id));
  69. }
  70. printf("%lld\n", ans);
  71. return 0;
  72. }

「洛谷5283」「LOJ3048」「十二省联考2019」异或粽子【可持久化01trie+优先队列】的更多相关文章

  1. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  2. LOJ #3049. 「十二省联考 2019」字符串问题

    LOJ #3049. 「十二省联考 2019」字符串问题 https://loj.ac/problem/3049 题意:给你\(na\)个\(A\)类串,\(nb\)个\(B\)类串,\(m\)组支配 ...

  3. 【LOJ】#3051. 「十二省联考 2019」皮配

    LOJ#3051. 「十二省联考 2019」皮配 当时我在考场上觉得这题很不可做... 当然,出了考场后再做,我还是没发现学校和城市是可以分开的,导致我还是不会 事实上,若一个城市投靠了某个阵营,学校 ...

  4. 「十二省联考 2019」皮配——dp

    题目 [题目描述] #### 题目背景一年一度的综艺节目<中国好码农>又开始了.本季度,好码农由 Yazid.Zayid.小 R.大 R 四位梦想导师坐镇,他们都将组建自己的梦想战队,并率 ...

  5. 「十二省联考 2019」字符串问题——SAM+DAG

    题目 [题目描述] Yazid 和 Tiffany 喜欢字符串问题.在这里,我们将给你介绍一些关于字符串的基本概念. 对于一个字符串 $S$, 我们定义 $\lvert S\rvert$ 表示 $S$ ...

  6. 「洛谷5290」「LOJ3052」「十二省联考 2019」春节十二响【启发式合并】

    题目链接 [洛谷传送门] [LOJ传送门] 题目大意 给定一棵树,每次选取树上的一个点集,要求点集中的每个点不能是另一个点的祖先,选出点集的代价为点集中权值最大点的权值,问将所有点都选一遍的最小代价为 ...

  7. LOJ 3049: 洛谷 P5284: 「十二省联考 2019」字符串问题

    题目传送门:LOJ #3049. 题意简述: 给定一个长度为 \(n\) 的母串 \(S\). 有 \(n_a\) 个 A 类串,都是 \(S\) 的子串,以区间的形式给出. 有 \(n_b\) 个 ...

  8. LOJ3048 「十二省联考 2019」异或粽子

    题意 题目描述 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 $n$ 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 $1$ 到 $n$.第 $i$ 种馅儿具 ...

  9. LOJ#3048. 「十二省联考 2019」异或粽子 Trie

    原文链接www.cnblogs.com/zhouzhendong/p/LOJ3048.html 题解 $O(n\log^2 {a_i})$ 的做法比较简单: 1. 求出第 k 大的是什么: 二分答案, ...

随机推荐

  1. Git远程分支的回退

    下午发现上午提交的一个版本有问题,在回退本地分支后,发现还必须要回退远程分支的版本.网上查找到的资料如下: #新建old_master分支做备份 git branch old_master #push ...

  2. js基础语法之函数

    普通函数 function foo(a, b){ return a + b; } foo(10, 20) >>> 30 匿名函数 var f = function(){console ...

  3. python_format格式化输出、while else、逻辑运算符、编码初识

    1.格式化输出 .%d  %s  格式化输出:% 占位符,d 表示替换整型数,s表示要替换字符串. name = input('请输入名字:') age = input('请输入年龄:') sex = ...

  4. shell脚本--操作MySQL数据库

    其实就是一个很简单的套路,和其他语言差不多,首先连接数据库,然后在进行其他操作. 套路如下: #!/bin/bash mysql="mysql -uroot -proot" #连接 ...

  5. 爬虫——cookies池的搭建

    https://github.com/Python3WebSpider/cookiesPool

  6. Linux&Windows中VNC协议及使用方法

    [转载]window下使用vnc远程登录ubuntu/linux图形界面_五个粽子_新浪博客http://blog.sina.com.cn/s/blog_677265f601012mqg.html V ...

  7. MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍

    mysql 5.7版本 出现 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre ...

  8. 20181114教学sql

    --精确查找:查询水表编号为30408的业主记录 ' --模糊查询:查询业主名称包含'刘'的业主记录 SELECT * FROM T_OWNERS WHERE NAME LIKE '%刘%' --AN ...

  9. PLA-1

    PLA(Principal Component Analysis)主成分分析: 思路1:坐标旋转 1.数据分布以及投影: 2.特征值以及特征向量 思路2: 未完待续...

  10. python之路--FTP 上传视频示例

    # 服务端 import json import socket import struct server = socket.socket() server.bind(('127.0.0.1',8001 ...