LOJ
洛谷

考场上都拍上了,8:50才发现我读错了题=-=
两天都读错题...醉惹...


\(Solution1\)
先求一遍前缀异或和。
假设左端点是\(i\),那么我们要在\([i,n]\)中找一个\(sum_j\)使得它和\(sum_{i-1}\)异或最大。可以可持久化Trie。
对\(i\in[1,n]\)都求一遍它能得到的最大的异或值,扔到堆里。
每次从堆里找出值最大的,假设是\(x\),与\(sum_{x-1}\)异或得到最大值的数是\(sum_y\),那么之后就不能选\(sum_{x-1}\ \mathbb{xor}\ sum_y\)了。
记\(T_i\)为第\(i\)棵\(Trie\)。因为查询最大值时,我们是用\(T_n\)与\(T_{i-1}\)的\(size\)差是否\(>0\),来判断能否取一个值。
所以现在令\(T_{x-1}\)在\(sum_y\)这条路径上的\(size+1\),就可以实现删掉一个\(sum_y\)了。
修改\(T_{x-1}\)之后再找一个和\(sum_{x-1}\)异或最大的,把\(x\)扔到堆里。
这个\(Modify\)和\(Insert\)函数一模一样(考场上我竟然没注意到这个=-=)。

\(Solution2\)
\(sum_i\ ^{\wedge}sum_j=sum_j\ ^{\wedge}sum_i\),所以可以把\(k\)变成\(2k\),求任意一对数异或,能得到的最大的\(k\)对是多少。
对每个数求一下和它异或最大的是哪个,扔到堆里。
每次从堆里取出值最大的一个数\(i\),加上\(i\)的答案。然后我们要找,和\(sum_i\)异或第二大的值是哪个。在\(Trie\)上查即可。再扔到堆里。再下一次就查,和\(sum_i\)异或第\(3\)大的值是哪个...
对所有数建一棵\(Trie\)即可。

\(Solution3\)
有一种类似[NOI2010]超级钢琴的做法。


代码是考场上的代码,有点丑,但也没什么改的必要了...

#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#include <unordered_map>
#define mp std::make_pair
#define pr std::pair<uint,int>
#define BIT 31
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef unsigned int uint;
typedef long long LL;
typedef unsigned long long ull;
const int N=5e5+5;int root[N];
uint A[N],sum[N];
std::priority_queue<pr> q;
//std::mt19937 Rand(1002330);
char IN[MAXIN],*SS=IN,*TT=IN;
struct Trie
{#define S N*(BIT+2)*2int tot,son[S][2],sz[S];void Insert(int &rt,int y,uint v){int x=rt=++tot;for(int i=BIT; ~i; --i){int c=v>>i&1;son[x][c^1]=son[y][c^1];x=son[x][c]=++tot, y=son[y][c], sz[x]=sz[y]+1;}}uint Query(int x,int y,uint v)//y-x{uint res=0;for(int i=BIT; ~i; --i){int c=(v>>i&1)^1;if(sz[son[y][c]]-sz[son[x][c]]>0) res|=1u<<i;else c^=1;x=son[x][c], y=son[y][c];}return res;}void Modify(int &rt,int X,uint v){int x=rt=++tot;for(int i=BIT; ~i; --i){int c=(v>>i&1);son[x][c^1]=son[X][c^1];x=son[x][c]=++tot, X=son[X][c], sz[x]=sz[X]+1;}}
}T;inline uint read()
{uint now=0; register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now;
}
namespace Subtask1
{uint q[4000005];void Main(int n,int K){int t=0;for(int i=1; i<=n; ++i){uint now=0;for(int j=i; j<=n; ++j)now^=A[j], q[++t]=now;}std::sort(q+1,q+1+t,std::greater<uint>());LL ans=0;for(int i=1; i<=t&&i<=K; ++i) ans+=q[i];printf("%I64d\n",ans);}
}int main()
{freopen("xor.in","r",stdin);freopen("xor.out","w",stdout);int n=read(),K=read();for(int i=1; i<=n; ++i) A[i]=read(),sum[i]=A[i]^sum[i-1];
//  if(n<=2000) return Subtask1::Main(n,K),0;for(int i=1; i<=n; ++i) T.Insert(root[i],root[i-1],sum[i]);for(int i=1; i<=n; ++i) q.push(mp(T.Query(root[i-1],root[n],sum[i-1]),i));LL ans=0;while(K--&&!q.empty()){uint tmp=q.top().first; ans+=tmp;int x=q.top().second; q.pop();T.Modify(root[x-1],root[x-1],tmp^sum[x-1]);q.push(mp(T.Query(root[x-1],root[n],sum[x-1]),x));}printf("%I64d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10673040.html

洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)相关推荐

  1. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  2. [十二省联考 2019] 异或粽子(可持久化字典树 + 二叉堆)

    problem luogu-P5283 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 nnn 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 111 到 nn ...

  3. P5283-[十二省联考2019]异或粽子【可持久化Trie,堆】

    正题 题目链接:https://www.luogu.org/problemnew/show/P5283 题目大意 给定一个序列,求kkk个不同的的[l..r][l..r][l..r]的区间异或值的和最 ...

  4. 十二省联考 2019 题解

    [十二省联考2019]异或粽子 首先异或转前缀和,类似超级钢琴,将三元组 ( l , r , p ) (l,r,p) (l,r,p) 插入堆,表示 s u m [ p ] sum[p] sum[p] ...

  5. 【BZOJ5498】[十二省联考2019]皮配(动态规划)

    [BZOJ5498][十二省联考2019]皮配(动态规划) 题面 BZOJ 洛谷 题解 先考虑暴力\(dp\),设\(f[i][j][k]\)表示前\(i\)所学校,有\(j\)人在某个阵营,有\(k ...

  6. [十二省联考2019]春节十二响——长链剖分+堆

    题目链接: [十二省联考2019]春节十二响 可以发现每条链上的所有点都要放在不同的段里,那么最多只需要树的深度这么多段就够了. 因为这样可以保证每条链上的点可以放在不同的段中而且一个点放在这些段中一 ...

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

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

  8. 【十二省联考2019】春节十二响

    题面 https://www.luogu.org/problem/P5290 题解 真的是我傻逼,十二省联考$day2$至今还是我的噩梦.$day1$起码一直在调可持久化$trie$树,$day2$真 ...

  9. 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)

    题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...

  10. HAOI(十二省联考)2019 qwq记

    \(\large{Day\ -1}:\) 放假了,白天大概是抱着最后一次在机房的心态复习着板子过去的.看着机房里的各位神仙丝毫不慌的颓倒是有点慌了,敲了一下多项式的板子感觉写的相当自闭,感觉AFO应该 ...

最新文章

  1. mysql+3.11.1_【MySql】1.3 使用正则表达式搜索
  2. 推荐几首好听的Coldplay的歌
  3. EdgeGallery — AIO 离线部署 v1.5 版本
  4. 最后一英里连接如何用于SD-WAN部署?—Vecloud微云
  5. [Leedcode][JAVA][第155题][最小栈][基本类型包装类]
  6. C/C++中“空语句”的说明
  7. 什么是 USB 3.1
  8. linux入门怎么学?
  9. 课堂笔记(一些知识散点)但很有用(*^__^*)
  10. rename python_谈谈重命名方法renames详解
  11. 常见input输入框 点击 发光白色外阴影 focus
  12. 醒醒吧!只努力了一个礼拜就想成功,你不觉得无耻吗?
  13. 为什么家里pm25比外面高_你绝对不会相信在家用卷发棒烫发竟然比在外面烫发更伤发?...
  14. Spring Cloud Data Flow 2.0.1 GA 发布
  15. [机器学习实战] 基于概率论的分类方法:朴素贝叶斯
  16. FFmpeg下载秒级 支持各个平台各个版本
  17. JAVA如何封装省市区_基于element ui封装的省市区三级联动
  18. Codeforces 32C.Flea
  19. 【matplotlib】画图基本函数 pyplot.barh 画水平柱状图
  20. 关于#define/extern/static的思考与总结

热门文章

  1. 多示例代码:go语言中循环练习题,不包括break,continue
  2. python列表的应用与实例_python列表生成式应用案例
  3. 收音机磁棒天线4根接法_五六十年代不需要电的收音机,你见过吗?
  4. python2020个税_2020年你会算个人所得税吗?没关系,python脚本帮助你!
  5. synchronized()_synchronized 和 ReentrantLock 有什么区别?
  6. USACO翻译:USACO 2013 DEC Silver三题
  7. Java遇见HTML——JSP篇之JSP状态管理
  8. Mysql 分组聚合实现 over partition by 功能
  9. Spring学习篇01-Spring容器相关基本概念
  10. 云服务下的安全特点及基础防护