和超级钢琴,异或之三倍经验 $?$

堆+贪心素质三连 $?$

好无聊......

code:

  1. #include <bits/stdc++.h>
  2. #define N 500006
  3. #define ll long long
  4. #define setIO(s) freopen(s".in","r",stdin) // , freopen(s".out","w",stdout)
  5. using namespace std;
  6. char buf[100000],*p1,*p2;
  7. #define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
  8. ll rd()
  9. {
  10. ll x=0; char s=nc();
  11. while(s<'0') s=nc();
  12. while(s>='0') x=(ll)(((x<<2)+x)<<1)+s-'0',s=nc();
  13. return x;
  14. }
  15. namespace trie
  16. {
  17. int tot;
  18. int cnt[N*42],ch[N*42][2];
  19. int newnode() { return ++tot; }
  20. void Insert(int pre,int &x,ll v)
  21. {
  22. int now=x=newnode(),i;
  23. for(i=40;i>=0;--i)
  24. {
  25. int o=(1ll*(v>>i)&1);
  26. ch[now][o^1]=ch[pre][o^1];
  27. ch[now][o]=newnode();
  28. pre=ch[pre][o];
  29. now=ch[now][o];
  30. cnt[now]=cnt[pre]+1;
  31. }
  32. }
  33. ll query(int x,int y,ll z)
  34. {
  35. ll re=0;
  36. int i;
  37. for(i=40;i>=0;--i)
  38. {
  39. int o=(1ll*(z>>i)&1);
  40. if(ch[x][o^1]<ch[y][o^1]) re+=(1ll<<i),x=ch[x][o^1],y=ch[y][o^1];
  41. else x=ch[x][o],y=ch[y][o];
  42. }
  43. return re;
  44. }
  45. };
  46. struct node
  47. {
  48. int o,l,r;
  49. ll val;
  50. int pos;
  51. node(int a=0,int b=0,int c=0,ll d=0,int e=0):o(a),l(b),r(c),val(d),pos(e){}
  52. bool operator<(node b) const
  53. {
  54. return b.val>val;
  55. }
  56. };
  57. priority_queue<node>q;
  58. ll A[N],ar[N],id[N];
  59. int rt[N];
  60. set<int>S[N];
  61. set<int>::iterator it;
  62. int main()
  63. {
  64. // setIO("input");
  65. int i,j,n,k,ou=0;
  66. n=rd(),k=rd();
  67. for(i=1;i<=n;++i)
  68. {
  69. A[i]=rd()^A[i-1];
  70. id[i]=ar[i]=A[i];
  71. trie::Insert(rt[i-1],rt[i],A[i]);
  72. }
  73. sort(ar+1,ar+1+n);
  74. for(i=1;i<=n;++i) id[i]=lower_bound(ar+1,ar+1+n,id[i])-ar;
  75. for(i=1;i<=n;++i) S[(int)id[i]].insert(i);
  76. for(i=0;i<n;++i)
  77. {
  78. int l=i+1,r=n;
  79. ll tmp=trie::query(rt[l-1],rt[r],A[i]);
  80. int idx=lower_bound(ar+1,ar+1+n,A[i]^tmp)-ar;
  81. int pos=*S[idx].lower_bound(l);
  82. q.push(node(i,l,r,tmp,pos));
  83. }
  84. ll ans=0ll;
  85. while(ou<k)
  86. {
  87. node e=q.top(); q.pop();
  88. ans+=(ll)e.val,++ou;
  89. int pos=e.pos;
  90. if(pos!=e.l)
  91. {
  92. ll tmp=trie::query(rt[e.l-1],rt[pos-1],A[e.o]);
  93. int idx=lower_bound(ar+1,ar+1+n,A[e.o]^tmp)-ar;
  94. int t=*S[idx].lower_bound(e.l);
  95. q.push(node(e.o,e.l,pos-1,tmp,t));
  96. }
  97. if(pos!=e.r)
  98. {
  99. ll tmp=trie::query(rt[pos],rt[e.r],A[e.o]);
  100. int idx=lower_bound(ar+1,ar+1+n,A[e.o]^tmp)-ar;
  101. int t=*S[idx].lower_bound(pos+1);
  102. q.push(node(e.o,pos+1,e.r,tmp,t));
  103. }
  104. }
  105. printf("%lld\n",ans);
  106. return 0;
  107. }

  

BZOJ 5495: [2019省队联测]异或粽子 可持久化trie+堆的更多相关文章

  1. BZOJ 5495: [2019省队联测]异或粽子 (trie树)

    这题果然是原题[BZOJ 3689 异或之].看了BZOJ原题题解,发现自己sb了,直接每个位置维护一个值保存找到了以这个位置为右端点的第几大,初始全部都是1,把每个位置作为右端点能够异或出来的最大值 ...

  2. bzoj 5495: [2019省队联测]异或粽子【可持久化trie+大根堆】

    和bzoj4504差不多,就是换了个数据结构 像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么 ...

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

    LOJ 洛谷 考场上都拍上了,8:50才发现我读错了题=-= 两天都读错题...醉惹... \(Solution1\) 先求一遍前缀异或和. 假设左端点是\(i\),那么我们要在\([i,n]\)中找 ...

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

    求 \(n\) 元数列的 \(k\) 个不同的子区间使得各个子区间异或和之和最大. Solution (差点又看错题了) 做个前缀和,于是转化成求序列异或和最大的 \(k\) 个数对 建一棵可持久化 ...

  5. [十二省联考2019]异或粽子——可持久化trie树+堆

    题目链接: [十二省联考2019]异或粽子 求前$k$大异或区间,可以发现$k$比较小,我们考虑找出每个区间. 为了快速得到一个区间的异或和,将原序列做前缀异或和. 对于每个点作为右端点时,我们维护出 ...

  6. bzoj 5499: [2019省队联测]春节十二响【堆】

    首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 #include<iostream& ...

  7. bzoj 5498: [2019省队联测]皮配【dp】

    是个神仙dp-- 参考:https://www.luogu.org/blog/xzz-233/solution-p5289 设f[i][j][k]是前i个有限制的城市,所有学校中选蓝色阵营有j人,有限 ...

  8. bzoj 5496: [2019省队联测]字符串问题【SAM+拓扑】

    有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的: 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SA ...

  9. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

随机推荐

  1. VM配置Centos(第十三步分区设置)

    1.点击开启此虚拟机之后,选择第一个 (注意:如果鼠标不显示出来,按alt+ctrl键) 2.然后选择skip跳过检测,如果选择了ok就会有很长时间的检测 3.然后选择NEXT 4.选择中文,然后点击 ...

  2. count_if 功能模板

    count_if 功能模板 template <class InputIterator, class UnaryPredicate> typename iterator_traits< ...

  3. Vivado关联Modelsim进行联合仿真

    Vivado自带仿真工具,但是有点慢,关联Modelsim联合仿真是最好的,注意Modelsim必须是10.7以上版本. 1.安装并成功破解Modelsim 10.7. 2.打开Vivado,点击 T ...

  4. ubuntu 使用阿里云镜像源快速搭建kubernetes 1.15.2集群

    一.概述 搭建k8s集群时,需要访问google,下载相关镜像以及安装软件,非常麻烦. 正好阿里云提供了k8s的更新源,国内用户就可以直接使用了. 二.环境介绍 操作系统 主机名 IP地址 功能 配置 ...

  5. Spark实战电影点评系统(二)

    二.通过DataFrame实战电影点评系统 DataFrameAPI是从Spark 1.3开始就有的,它是一种以RDD为基础的分布式无类型数据集,它的出现大幅度降低了普通Spark用户的学习门槛. D ...

  6. [cf 1239 B] The World Is Just a Programming Task (Hard Version)

    题意: 给你一个长度为n的括号序列,你可以交换其中的两个元素,需要使该序列的n个循环移位中合法的括号序列个数尽量多. 输出最大的答案以及交换哪两个元素能够取到这个答案. $n\leq 3\times ...

  7. git 学习笔记--Feature分支

    软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合 ...

  8. HttpClient参观记:.net core 2.2 对HttpClient到底做了神马

    .net core 于 10月17日发布了 ASP.NET Core 2.2.0 -preview3,在这个版本中,我看到了一个很让我惊喜的新特性:HTTP Client Performance Im ...

  9. MySQL8.0 下载安装启动(Windows10)

    2019年6月13日20:13:21 MySQL8.0 下载安装启动(Windows10) 下载 下载地址:https://dev.mysql.com/downloads/mysql/8.0.html ...

  10. C# DataTable、DataSet、List、相互转换

      DataTable转LIst /// <summary> /// 利用反射将DataTable转换为List<T>对象 /// </summary> /// & ...