2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)
问题 I: qwb VS 去污棒
时间限制: 2 Sec 内存限制: 256 MB
提交: 74 解决: 26
[提交][状态][讨论版]
题目描述
去污棒和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
- 5 5
- 1 2 3 4 5
- 2 1 3 4
- 1 10
- 1 7
- 2 4 4 5
- 2 1 5 19
样例输出
- Case 1:
- 6
- 9
- 31
题目链接:I题
如果用过可持久化Trie就可以发现这题解法已经非常明显了,但是他的序列是会变动的,那么由于题目是后缀异或和的性质,可以倒着做,用可持久化Trie维护最后的后缀异或值序列,然后考虑倒着做的时候每一次是减掉末尾的数x的影响,记后缀异或值序列为{后缀和},那么有:$max(x⊕({后缀和}⊕y))$与$max((x⊕y)⊕({后缀和}))$是等价的,那么我们记录一下倒着做的时候去掉的x的影响即用一个变量维护一下x的倒着的前缀和即可,然后由于是倒着维护的序列且是倒着离线,因此查询区间为$[r+1,l]$,答案也是倒着输出,感动~学的数据结构比赛的时候终于派上用场了……
代码:
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 400010;
- struct Trie
- {
- int nxt[2];
- int cnt;
- };
- Trie L[N * 27];
- int tot, root[N];
- int suf[N], arr[N];
- int Ans[N];
- struct info
- {
- int ops;
- int l, r, x;
- };
- info P[N];
- void init()
- {
- memset(L, 0, sizeof(L));
- tot = 0;
- }
- void update(int &cur, int ori, int step, int n, int v)
- {
- cur = ++tot;
- L[cur] = L[ori];
- L[cur].cnt += v;
- if (step < 0)
- return ;
- int t = (n >> step) & 1;
- update(L[cur].nxt[t], L[ori].nxt[t], step - 1, n, v);
- }
- int Find(int S, int E, int step, int n)
- {
- if (step < 0)
- return 0;
- int t = (n >> step) & 1;
- if (L[L[E].nxt[t ^ 1]].cnt - L[L[S].nxt[t ^ 1]].cnt > 0)
- return (1 << step) + Find(L[S].nxt[t ^ 1], L[E].nxt[t ^ 1], step - 1, n);
- else
- return Find(L[S].nxt[t], L[E].nxt[t], step - 1, n);
- }
- int main(void)
- {
- //printf("%d\n",31^19);
- int tcase, n, m, i;
- scanf("%d", &tcase);
- for (int q = 1; q <= tcase; ++q)
- {
- init();
- scanf("%d%d", &n, &m);
- for (i = 1; i <= n; ++i)
- scanf("%d", &arr[i]);
- for (i = 1; i <= m; ++i)
- {
- scanf("%d", &P[i].ops);
- if (P[i].ops == 1)
- {
- scanf("%d", &P[i].x);
- arr[++n] = P[i].x;
- }
- else if (P[i].ops == 2)
- {
- scanf("%d%d%d", &P[i].l, &P[i].r, &P[i].x);
- }
- }
- suf[n + 1] = 0;
- for (i = n; i >= 1; --i)
- {
- suf[i] = suf[i + 1] ^ arr[i];
- update(root[i], root[i + 1], 25, suf[i], 1);
- }
- int last = 0;
- printf("Case %d:\n", q);
- int sz = 0;
- for (i = m; i >= 1; --i)
- {
- if (P[i].ops == 1)
- {
- last ^= P[i].x;
- }
- else if (P[i].ops == 2)
- {
- int one = P[i].x ^ last;
- Ans[++sz] = Find(root[P[i].r + 1], root[P[i].l], 25, one);
- }
- }
- for (i = sz; i >= 1; --i)
- printf("%d\n", Ans[i]);
- }
- }
2017年浙江工业大学之江学院程序设计竞赛决赛 I: qwb VS 去污棒(可持久化Trie+离线)的更多相关文章
- 江西财经大学第一届程序设计竞赛 G题 小Q的口袋校园
链接:https://www.nowcoder.com/acm/contest/115/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 2017广东工业大学程序设计竞赛决赛-tmk买礼物
tmk买礼物 Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店 ...
- 2017广东工业大学程序设计竞赛决赛 题解&源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)
心得: 这比赛真的是不要不要的,pending了一下午,也不知道对错,直接做过去就是了,也没有管太多! Problem A: 两只老虎 Description 来,我们先来放松下,听听儿歌,一起“唱” ...
- 2017广东工业大学程序设计竞赛决赛 Problem E: 倒水(Water) (详解)
倒水(Water) Description 一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水.接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子.每次他选择两个当前含水 ...
- 2017年浙江工业大学大学生程序设计迎新赛预赛 H - 栗酱的文明
题目描述 “伟大的勇士兔栽栗女王,所有栗子看到您都不寒而栗,但也非常尊重您.您骑着威风凛凛的小白兔,带领兔栽栗们奋勇前行.伟大史诗告诉我们,烈兔勇栗从大草原飞奔出来,冲在每场战争的前线 ...
- 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏
Description 众所周知的是,TMK特别容易迟到,终于在TMK某次又迟到了之后,Maple怒了,Maple大喊一声:"我要跟你决一死战!"然后Maple就跟TMK玩起了一个 ...
- 2017年浙江工业大学大学生程序设计迎新赛热身赛-J-Forever97与寄信
Forever97与未央是一对笔友,他们经常互相写信.有一天Forever97去邮局寄信,发现邮局的收费方式变成了按字收费,收取的费用为总字数除了其自身以外的最大因子.虽然Forever97是一个有情 ...
- 2017广东工业大学程序设计竞赛决赛 F(LCA + 斐波那契数列性质)
不能组成三角形的极端数列:1,1,2,3,5,8,13,21,……到第50项时候肯定到1e9了…… 如果两个点之间距离大于50,则直接Yes…… 否则的话直接暴力取出所有边,然后升序排序,判断一下就可 ...
- 2017广东工业大学程序设计竞赛决赛 G 等凹数字
题意: Description 定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如54 ...
随机推荐
- 安装git 配置邮箱和用户名
git 查看用户名和邮箱地址 $ git config user.email $ git config user.name 运行命令来配置你的用户名和邮箱 $ git config --global ...
- flush caches
- java调用摄像头
http://blog.csdn.net/xing_sky/article/details/43482213 原文地址:http://blog.csdn.net/zajin/article/detai ...
- 在 Java 8 中避免 Null 检查
如何预防 Java 中著名的 NullPointerException 异常?这是每个 Java 初学者迟早会问到的关键问题之一.而且中级和高级程序员也在时时刻刻规避这个错误.其是迄今为止 Java ...
- C/C++程序基础 (七)继承和多态
多态 编译时多态:重载 运行时多态:虚函数.根据运行时的类别获取正确的虚指针,从而定位正确的虚函数. 虚函数 虚函数指针:指向虚函数表.多重继承则含有多个基类的虚函数指针. 虚函数表:函数指针集合.普 ...
- 52shaidan.net
52shaidan.net 52gendan.net 朋友的域名
- http请求中客户端真实的ip
private String getRemoteAddr() { String ip = ""; String unknow = "unknown"; try ...
- Linux下重要日志及查看方式
1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示: 图1 /var/log/boot. ...
- Shell脚本使用汇总整理——达梦数据库备份脚本
Shell脚本使用汇总整理——达梦数据库备份脚本 Shell脚本使用的基本知识点汇总详情见连接: https://www.cnblogs.com/lsy-blogs/p/9223477.html 脚本 ...
- JS的四舍五入问题
最近踩了一个坑,mark一下toFixed四舍五入问题,详见代码: var myFixed = function(num, fix) { num = (parseFloat(num) * + ) / ...