http://www.lydsy.com/JudgeOnline/problem.php?id=3166

这道题难点在于求能对一个次大值有贡献的区间。

设这个次大值为\(a_i\),\(a_i\)左边第一个和第二个比它大的设为\(l_1\),\(l_2\),右边第一个和第二个比它大的设为\(r_1\),\(r_2\)。

\(a_i\)是次大值的区间就是\((l_1,r_2)\)和\((l_2,r_1)\)(直接排序后用set就可以了)。

找这两个区间里和\(a_i\)的异或最大值(实际上可以求两个区间的并),直接用主席树就可以了(为什么叫它可持久化Trie?什么是可持久化Trie?)

空间开小了导致WA,以后主席树不能再卡着空间开了qwq

时间复杂度\(O(n\log n)\)。

  1. #include<set>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N = 50003;
  7. int l1[N], l2[N], r1[N], r2[N], a[N], id[N], n;
  8. set <int> s;
  9. set <int> :: iterator it, itl, itr;
  10. bool cmp(int x, int y) {return a[x] < a[y];}
  11. struct node {
  12. int l, r, s;
  13. } T[N * 31];
  14. int root[N], cnt = 0;
  15. int cc;
  16. void update(int &pos, int tmp, int num) {
  17. T[++cnt] = T[pos]; pos = cnt; ++T[pos].s;
  18. if (tmp == -1) return;
  19. if ((1 << tmp) & num) update(T[pos].r, tmp - 1, num);
  20. else update(T[pos].l, tmp - 1, num);
  21. }
  22. int ask(int Tl, int Tr, int tmp, int num) {
  23. if (tmp == -1) return 0;
  24. if ((1 << tmp) & num) {
  25. if (T[T[Tr].l].s - T[T[Tl].l].s == 0) return ask(T[Tl].r, T[Tr].r, tmp - 1, num);
  26. else return (1 << tmp) | ask(T[Tl].l, T[Tr].l, tmp - 1, num);
  27. } else {
  28. if (T[T[Tr].r].s - T[T[Tl].r].s == 0) return ask(T[Tl].l, T[Tr].l, tmp - 1, num);
  29. else return (1 << tmp) | ask(T[Tl].r, T[Tr].r, tmp - 1, num);
  30. }
  31. }
  32. int main() {
  33. scanf("%d", &n);
  34. for (int i = 1; i <= n; ++i) scanf("%d", a + i), id[i] = i;
  35. stable_sort(id + 1, id + n + 1, cmp);
  36. for (int i = n; i >= 1; --i) {
  37. s.insert(id[i]);
  38. it = s.lower_bound(id[i]);
  39. itl = itr = it;
  40. if (itl != s.begin())
  41. --itl, l1[id[i]] = *itl;
  42. if (itl != s.begin())
  43. --itl, l2[id[i]] = *itl;
  44. if (itr != --s.end())
  45. ++itr, r1[id[i]] = *itr;
  46. else r1[id[i]] = n + 1;
  47. if (itr != --s.end())
  48. ++itr, r2[id[i]] = *itr;
  49. else r2[id[i]] = n + 1;
  50. }
  51. for (int i = 1; i <= n; ++i) {
  52. root[i] = root[i - 1];
  53. update(root[i], 29, a[i]);
  54. }
  55. int ans = 0;
  56. for (int i = 1; i <= n; ++i)
  57. if (l1[i] != 0 || r1[i] != n + 1)
  58. ans = max(ans, ask(root[l2[i]], root[r2[i] - 1], 29, a[i]));
  59. printf("%d\n", ans);
  60. return 0;
  61. }

【BZOJ 3166】【HEOI 2013】Alo的更多相关文章

  1. 【BZOJ 3165】【HEOI 2013】Segment

    往区间上覆盖一次函数,做法是用线段树维护标记永久化. 每次都忘了线段树要4倍空间,第一次交总是RE,再这么手残的话考场上就真的要犯逗了. #include<cstdio> #include ...

  2. 【BZOJ】【3166】【HEOI2013】Alo

    可持久化Trie+set Orz zyf…… 搞区间中次大值不好搞,那么我们就反过来,找一个数,然后看它在哪些区间里是次大值…… (然而事实上我们并不用真的把这个区间具体是什么找见,只要知道它可以跟哪 ...

  3. 【BZOJ】【3170】【TJOI2103】松鼠聚会

    切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...

  4. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  5. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  6. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  7. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  8. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  9. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

随机推荐

  1. 【51NOD】数字1的数量

    [算法]数位DP [题解]数位dp总结 之 从入门到模板 #include<cstdio> #include<algorithm> #include<cstring> ...

  2. python学习笔记(三)之变量和字符串

    在其他语言中,变量就是有名字的存储区,可以将值存储在变量中,也即内存中.在Python中略有不同,python并不是将值存储在变量中,更像是把名字贴在值上边.所以,有些python程序员会说pytho ...

  3. 爬虫--requests讲解

    什么是requests? Requests是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的HTTP库.它比urllib更加方便,可以节约我们大量的工作,完全 ...

  4. Python switch-case语句的实现 -- 字典模拟实现

    static void print_asru_status(int status, char *label) { char *msg = NULL; switch (status) { : msg = ...

  5. 多github帐号的SSH key切换

    我有两个github帐号,一个是个人所用,一个是为公司项目所用.如果是单用户(single-user),很方便,默认拿id_rsa与你的github服务器的公钥对比:如果是多用户(multi-user ...

  6. Python第三方库wordcloud(词云)快速入门与进阶

    前言: 笔主开发环境:Python3+Windows 推荐初学者使用Anaconda来搭建Python环境,这样很方便而且能提高学习速度与效率. 简介: wordcloud是Python中的一个小巧的 ...

  7. 初识费用流 模板(spfa+slf优化) 餐巾计划问题

    今天学习了最小费用最大流,是网络流算法之一.可以对于一个每条边有一个容量和一个费用(即每单位流的消耗)的图指定一个源点和汇点,求在从源点到汇点的流量最大的前提下的最小费用. 这里讲一种最基础也是最好掌 ...

  8. Python脚本 - 查询磁盘的读写次数信息

    测试系统为:Centos 6.7 Python版本为: 3.6.4 脚本功能:查看指定磁盘的读写及时间等相关信息 #!/usr/bin/env python3 from collections imp ...

  9. 菜鸟学习nodejs--Socket.IO即时通讯

    https://blog.csdn.net/lovemenghaibin/article/details/51263774

  10. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6150 Vertex Cover 二分图,构造

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6150 题意:"最小点覆盖集"是个NP完全问题 有一个近似算法是说—每次选取度数最大 ...