3261: 最大异或和

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 3519  Solved: 1493
[Submit][Status][Discuss]

Description

给定一个非负整数序列{a},初始长度为N。
有M个操作,有以下两种操作类型:
1、Ax:添加操作,表示在序列末尾添加一个数x,序列的长度N+1。
2、Qlrx:询问操作,你需要找到一个位置p,满足l<=p<=r,使得:
a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少。

Input

第一行包含两个整数 N  ,M,含义如问题描述所示。   
第二行包含 N个非负整数,表示初始的序列 A 。 
接下来 M行,每行描述一个操作,格式如题面所述。

Output

假设询问操作有 T个,则输出应该有 T行,每行一个整数表示询问的答案。

Sample Input

5 5
2 6 4 3 6
A 1
Q 3 5 4
A 4
Q 5 7 0
Q 3 6 6
对于测试点 1-2,N,M<=5 。
对于测试点 3-7,N,M<=80000 。
对于测试点 8-10,N,M<=300000 。
其中测试点 1, 3, 5, 7, 9保证没有修改操作。
0<=a[i]<=10^7。

Sample Output

4
5
6
区间异或和,用前缀和来处理,然后就是可持久化Trie树,贪心从高位到低位,就可以保证尽量最大。
RE了7发,TLE了11发,发现数组开小了,开大就TLE,发现不能用cin,cout改成scanf和printf就过了,撞墙。。。
代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=6e5;
 5
 6 int son[maxn<<5][2],sum[maxn<<5],root[maxn],ret[maxn],sz=0;
 7 //son每个节点指向的两个节点的位置,sum每个节点出现的次数,root每棵01Trie根节点的位置
 8
 9 void insert(int val,int &x,int pre)
10 {
11     x=++sz;int t=x;
12     for(int i=23;i>=0;i--){
13         son[t][0]=son[pre][0];son[t][1]=son[pre][1];
14         sum[t]=sum[pre]+1;
15         int j=(val>>i)&1;
16         son[t][j]=++sz;//新开的节点
17         t=son[t][j];pre=son[pre][j];
18     }
19     sum[t]=sum[pre]+1;
20 }
21
22 int query(int val,int x,int y)
23 {
24     int ans=0;
25     for(int i=23;i>=0;i--){
26         int j=(val>>i)&1;
27         if(sum[son[y][j^1]]-sum[son[x][j^1]]>0){
28             ans+=(1<<i);
29             x=son[x][j^1];y=son[y][j^1];
30         }
31         else{
32             x=son[x][j];y=son[y][j];
33         }
34     }
35     return ans;
36 }
37
38 int main()
39 {
40     int n,m,x;
41     scanf("%d%d",&n,&m);
42     insert(ret[1],root[1],root[1]);
43     for(int i=2;i<=n+1;i++){
44         scanf("%d",&x);
45         ret[i]=ret[i-1]^x;
46         insert(ret[i],root[i],root[i-1]);
47     }
48     int h=n+1;
49     while(m--){
50         char op[2];
51         scanf("%s",op);
52         if(op[0]=='A'){
53             scanf("%d",&x);
54             ++h;
55             ret[h]=ret[h-1]^x;
56             insert(ret[h],root[h],root[h-1]);
57         }
58         else{
59             int l,r;
60             scanf("%d%d%d",&l,&r,&x);
61             printf("%d\n",query(ret[h]^x,root[l-1],root[r]));
62         }
63     }
64     return 0;
65 }

圆润的走开了。。。

转载于:https://www.cnblogs.com/ZERO-/p/10287651.html

BZOJ 3261: 最大异或和位置-贪心+可持久化01Trie树相关推荐

  1. BZOJ 3261: 最大异或和 [可持久化Trie]

    3261: 最大异或和 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1513  Solved: 657 [Submit][Status][Disc ...

  2. BZOJ 3261 最大异或和 可持久化Trie树

    题目大意:给定一个序列,提供下列操作: 1.在数组结尾插入一个数 2.给定l,r,x,求一个l<=p<=r,使x^a[p]^a[p+1]^...^a[n]最大 首先我们能够维护前缀和 然后 ...

  3. BZOJ3261 最大异或和 解题报告(可持久化Trie树)

    本题链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3261 题目描述 给定一个非负整数序列{a},初始长度为N. 有M个操作,有以下两种操作类 ...

  4. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  5. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

  6. bzoj 3261 最大异或和【可持久化trie】

    因为在后面加数字又求后缀和太麻烦,所以xor[p...n]=xor[1...n]^xor[p-1...n]. 首先处理出来区间异或前缀和,对前缀和建trie树(在最前面放一棵0表示最开始的前缀和 然后 ...

  7. BZOJ.3261.最大异或和(可持久化Trie)

    题目链接 这个每次修改后缀好像很难搞,但是因为异或可以抵消,求sum[p~n]的最大值可以转化为求sum[1~n] xor sum[1~p-1]的最大值. \(p-1\in [l-1,r-1]\),用 ...

  8. 【CodeForces 1100F】异或线性基 | 贪心 | 离线区间最大异或和 | E

    补题ing- 真的不应该错过这场比赛的 qwq 1100F. Ivan and Burgers time limit per test: 3 seconds memory limit per test ...

  9. BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)

    题目大意:给你一个长方形矩阵,位置$i,j$上的数是$a_{i}\;xor\;b_{j}$,求某个子矩阵内第$K$大的值 最先想的是二分答案然后验证,然而是$O(qnlogmloga_{i})$,不出 ...

最新文章

  1. .Net开发时有没有好的页面开发框架?
  2. win10 远程ubuntu
  3. Php 魔术函数性能,php常用的魔术函数详细解析
  4. 怎么向小学生解释欧拉公式 e^(πi)+1=0?
  5. All in Linux:一个算法工程师的IDE断奶之路
  6. Maven项目无法加载jdbc.properties
  7. 自旋锁和互斥锁实例_多线程编程之自旋锁
  8. Android 驱动(5)---MTK 平台分区表
  9. 《Android游戏开发详解》一1.8 控制流程第2部分——while和for循环
  10. 强悍的命令 —— 命令参数的理解
  11. 创建你自己的AngularJS -- 第一部分 Scopes(一)
  12. Windows中ActiveX控件注册的方法
  13. 转发-神器|最强电脑搜索神器(啥都能搜!!!)
  14. 页面字体颜色的设置及常用颜色的RGB值
  15. 马哥教育开学感想随笔
  16. 小米6刷android 8.0,小米6可以吃奥利奥了,抢先刷安卓8.0
  17. 牛顿迭代法求一个数的平方根(python)
  18. 区块链开发工程师和人工智能算法工程师,哪个会在未来 5 年收入更高?
  19. 路漫漫其修远兮···VB 来15个数尝尝咸淡
  20. 关于 maven插件爆红或插件版本爆红问题解决(且本地仓库存在相应插件版本)

热门文章

  1. [转]解读2014之前端篇:任性的颠覆式改变
  2. 快速删除node_modules文件夹!!!
  3. 详解用backgroundImage解决图片轮播切换
  4. python可以开多少线程_python爬虫可以开多少线程?
  5. 地推HTTP成长介绍
  6. Hadoop有什么用
  7. 一次性存入多少钱就可以有资格跟银行商谈利息了?
  8. 爷青结是什么意思,爷青回是什么意思,爷青结和爷青回是什么梗
  9. 生意场逃不开三个关键词:留存、转化、数据
  10. 最近和一个创业中的朋友喝茶聊天