问题 I: qwb VS 去污棒

时间限制: 2 Sec  内存限制: 256 MB
提交: 74  解决: 26
[提交][状态][讨论版]

题目描述

qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月。在外人看来,他每天自言自语,其实他在和自己的影子“去污棒”聊天。
去污棒和qwb互相出题考验对方,去污棒问了qwb这样一个问题:
现已知一个有n个正整数的序列a[1],a[2]...a[n],接下来有m个操作

操作一共有两种:

1.在序列末尾添加一个数x。

2.查询suf[p] xor x的最大值,其中xor是异或 ,l<=p<=r,
suf[t]表示从t开始的后缀的异或和,即suf[t]=a[t] xor a[t+1] xor ...xor a[len],len为序列长度。

输入

第一行一个整数T(<=5),表示一共有T组数据。

每组数据第一行两个整数n(<=200000),m(<=200000),意义如上所述。

随后一行有n个数,表示初始序列。
随后m行,每行表示一个操作。
操作有两种,1: x 表示在末尾添加一个x,2: l r x表示查询suf[p] xor x的最大值,其中l<= p <= r,
所有数及x不超过224 且保证所有操作合法。

输出

每组测试数据的第一行输出"Case x:",x为数据组数的标号,从1开始。

接下来,对每个操作2输出一行答案。

样例输入

  1. 1
  2. 5 5
  3. 1 2 3 4 5
  4. 2 1 3 4
  5. 1 10
  6. 1 7
  7. 2 4 4 5
  8. 2 1 5 19

样例输出

  1. Case 1:
  2. 6
  3. 9
  4. 31

题目链接:I题

如果用过可持久化Trie就可以发现这题解法已经非常明显了,但是他的序列是会变动的,那么由于题目是后缀异或和的性质,可以倒着做,用可持久化Trie维护最后的后缀异或值序列,然后考虑倒着做的时候每一次是减掉末尾的数x的影响,记后缀异或值序列为{后缀和},那么有:$max(x⊕({后缀和}⊕y))$与$max((x⊕y)⊕({后缀和}))$是等价的,那么我们记录一下倒着做的时候去掉的x的影响即用一个变量维护一下x的倒着的前缀和即可,然后由于是倒着维护的序列且是倒着离线,因此查询区间为$[r+1,l]$,答案也是倒着输出,感动~学的数据结构比赛的时候终于派上用场了……

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 400010;
  4. struct Trie
  5. {
  6. int nxt[2];
  7. int cnt;
  8. };
  9. Trie L[N * 27];
  10. int tot, root[N];
  11. int suf[N], arr[N];
  12. int Ans[N];
  13.  
  14. struct info
  15. {
  16. int ops;
  17. int l, r, x;
  18. };
  19. info P[N];
  20.  
  21. void init()
  22. {
  23. memset(L, 0, sizeof(L));
  24. tot = 0;
  25. }
  26. void update(int &cur, int ori, int step, int n, int v)
  27. {
  28. cur = ++tot;
  29. L[cur] = L[ori];
  30. L[cur].cnt += v;
  31. if (step < 0)
  32. return ;
  33. int t = (n >> step) & 1;
  34. update(L[cur].nxt[t], L[ori].nxt[t], step - 1, n, v);
  35. }
  36. int Find(int S, int E, int step, int n)
  37. {
  38. if (step < 0)
  39. return 0;
  40. int t = (n >> step) & 1;
  41. if (L[L[E].nxt[t ^ 1]].cnt - L[L[S].nxt[t ^ 1]].cnt > 0)
  42. return (1 << step) + Find(L[S].nxt[t ^ 1], L[E].nxt[t ^ 1], step - 1, n);
  43. else
  44. return Find(L[S].nxt[t], L[E].nxt[t], step - 1, n);
  45. }
  46. int main(void)
  47. {
  48. //printf("%d\n",31^19);
  49. int tcase, n, m, i;
  50. scanf("%d", &tcase);
  51. for (int q = 1; q <= tcase; ++q)
  52. {
  53. init();
  54. scanf("%d%d", &n, &m);
  55. for (i = 1; i <= n; ++i)
  56. scanf("%d", &arr[i]);
  57. for (i = 1; i <= m; ++i)
  58. {
  59. scanf("%d", &P[i].ops);
  60. if (P[i].ops == 1)
  61. {
  62. scanf("%d", &P[i].x);
  63. arr[++n] = P[i].x;
  64. }
  65. else if (P[i].ops == 2)
  66. {
  67. scanf("%d%d%d", &P[i].l, &P[i].r, &P[i].x);
  68. }
  69. }
  70. suf[n + 1] = 0;
  71. for (i = n; i >= 1; --i)
  72. {
  73. suf[i] = suf[i + 1] ^ arr[i];
  74. update(root[i], root[i + 1], 25, suf[i], 1);
  75. }
  76. int last = 0;
  77. printf("Case %d:\n", q);
  78. int sz = 0;
  79. for (i = m; i >= 1; --i)
  80. {
  81. if (P[i].ops == 1)
  82. {
  83. last ^= P[i].x;
  84. }
  85. else if (P[i].ops == 2)
  86. {
  87. int one = P[i].x ^ last;
  88. Ans[++sz] = Find(root[P[i].r + 1], root[P[i].l], 25, one);
  89. }
  90. }
  91. for (i = sz; i >= 1; --i)
  92. printf("%d\n", Ans[i]);
  93. }
  94. }

2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)的更多相关文章

  1. 江西财经大学第一届程序设计竞赛 G题 小Q的口袋校园

    链接:https://www.nowcoder.com/acm/contest/115/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...

  2. 2017广东工业大学程序设计竞赛决赛-tmk买礼物

    tmk买礼物 Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店 ...

  3. 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)

    心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...

  4. 2017广东工业大学程序设计竞赛决赛 Problem E: 倒水(Water) (详解)

    倒水(Water) Description 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水 ...

  5. 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明

    题目描述         “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...

  6. 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏

    Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...

  7. 2017年浙江工业大学大学生程序设计迎新赛热身赛-J-Forever97与寄信

    Forever97与未央是一对笔友,他们经常互相写信.有一天Forever97去邮局寄信,发现邮局的收费方式变成了按字收费,收取的费用为总字数除了其自身以外的最大因子.虽然Forever97是一个有情 ...

  8. 2017广东工业大学程序设计竞赛决赛 F(LCA + 斐波那契数列性质)

    不能组成三角形的极端数列:1,1,2,3,5,8,13,21,……到第50项时候肯定到1e9了…… 如果两个点之间距离大于50,则直接Yes…… 否则的话直接暴力取出所有边,然后升序排序,判断一下就可 ...

  9. 2017广东工业大学程序设计竞赛决赛 G 等凹数字

    题意: Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如54 ...

随机推荐

  1. 安装git 配置邮箱和用户名

    git 查看用户名和邮箱地址 $ git config user.email $ git config user.name 运行命令来配置你的用户名和邮箱 $ git config --global ...

  2. flush caches

  3. java调用摄像头

    http://blog.csdn.net/xing_sky/article/details/43482213 原文地址:http://blog.csdn.net/zajin/article/detai ...

  4. 在 Java 8 中避免 Null 检查

    如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一.而且中级和高级程序员也在时时刻刻规避这个错误.其是迄今为止 Java ...

  5. C/C++程序基础 (七)继承和多态

    多态 编译时多态:重载 运行时多态:虚函数.根据运行时的类别获取正确的虚指针,从而定位正确的虚函数. 虚函数 虚函数指针:指向虚函数表.多重继承则含有多个基类的虚函数指针. 虚函数表:函数指针集合.普 ...

  6. 52shaidan.net

    52shaidan.net 52gendan.net 朋友的域名

  7. http请求中客户端真实的ip

    private String getRemoteAddr() { String ip = ""; String unknow = "unknown"; try ...

  8. Linux下重要日志及查看方式

    1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示: 图1 /var/log/boot. ...

  9. Shell脚本使用汇总整理——达梦数据库备份脚本

    Shell脚本使用汇总整理——达梦数据库备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本 ...

  10. JS的四舍五入问题

    最近踩了一个坑,mark一下toFixed四舍五入问题,详见代码: var myFixed = function(num, fix) { num = (parseFloat(num) * + ) / ...