【BZOJ 3166】【HEOI 2013】Alo
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)\)。
#include<set>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 50003;
int l1[N], l2[N], r1[N], r2[N], a[N], id[N], n;
set <int> s;
set <int> :: iterator it, itl, itr;
bool cmp(int x, int y) {return a[x] < a[y];}
struct node {
int l, r, s;
} T[N * 31];
int root[N], cnt = 0;
int cc;
void update(int &pos, int tmp, int num) {
T[++cnt] = T[pos]; pos = cnt; ++T[pos].s;
if (tmp == -1) return;
if ((1 << tmp) & num) update(T[pos].r, tmp - 1, num);
else update(T[pos].l, tmp - 1, num);
}
int ask(int Tl, int Tr, int tmp, int num) {
if (tmp == -1) return 0;
if ((1 << tmp) & num) {
if (T[T[Tr].l].s - T[T[Tl].l].s == 0) return ask(T[Tl].r, T[Tr].r, tmp - 1, num);
else return (1 << tmp) | ask(T[Tl].l, T[Tr].l, tmp - 1, num);
} else {
if (T[T[Tr].r].s - T[T[Tl].r].s == 0) return ask(T[Tl].l, T[Tr].l, tmp - 1, num);
else return (1 << tmp) | ask(T[Tl].r, T[Tr].r, tmp - 1, num);
}
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", a + i), id[i] = i;
stable_sort(id + 1, id + n + 1, cmp);
for (int i = n; i >= 1; --i) {
s.insert(id[i]);
it = s.lower_bound(id[i]);
itl = itr = it;
if (itl != s.begin())
--itl, l1[id[i]] = *itl;
if (itl != s.begin())
--itl, l2[id[i]] = *itl;
if (itr != --s.end())
++itr, r1[id[i]] = *itr;
else r1[id[i]] = n + 1;
if (itr != --s.end())
++itr, r2[id[i]] = *itr;
else r2[id[i]] = n + 1;
}
for (int i = 1; i <= n; ++i) {
root[i] = root[i - 1];
update(root[i], 29, a[i]);
}
int ans = 0;
for (int i = 1; i <= n; ++i)
if (l1[i] != 0 || r1[i] != n + 1)
ans = max(ans, ask(root[l2[i]], root[r2[i] - 1], 29, a[i]));
printf("%d\n", ans);
return 0;
}
【BZOJ 3166】【HEOI 2013】Alo的更多相关文章
- 【BZOJ 3165】【HEOI 2013】Segment
往区间上覆盖一次函数,做法是用线段树维护标记永久化. 每次都忘了线段树要4倍空间,第一次交总是RE,再这么手残的话考场上就真的要犯逗了. #include<cstdio> #include ...
- 【BZOJ】【3166】【HEOI2013】Alo
可持久化Trie+set Orz zyf…… 搞区间中次大值不好搞,那么我们就反过来,找一个数,然后看它在哪些区间里是次大值…… (然而事实上我们并不用真的把这个区间具体是什么找见,只要知道它可以跟哪 ...
- 【BZOJ】【3170】【TJOI2103】松鼠聚会
切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】【2084】【POI2010】Antisymmetry
Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
- 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
随机推荐
- 【BZOJ】2982 combination
[算法]组合数取模——lucas定理 #include<cstdio> #include<algorithm> #include<cstring> using na ...
- Mac 上真机调试cocos2d-x-3.16的test程序
文章比较长,一个算是新手又不是新手的程序员的解决过程. 一 xcode中打开项目 首先,下载完成cocos2d-x-3.16之后,解压,然后在根目录build目录下双击cocos2d_tests.xc ...
- 取(m堆)石子游戏 HDU2176(Nim博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 题目: Problem Description m堆石子,两人轮流取.只能在1堆中取.取完者胜. ...
- springcloud基于ribbon的canary路由方案
思路 根据eureka的metadata进行自定义元数据,然后使用ribbon对该元数据进行过滤和匹配,选择server. 实现 这里使用header来传递路由信息,改造ribbon-discover ...
- 通过JDBC连接HiveServer2
如果通过JDBC连接HiveServer2时提示:User: hive is not allowed to impersonate hive,需要在core-site.xml中新增如下配置: hado ...
- Python爬虫—破解JS加密的Cookie
前言 在GitHub上维护了一个代理池的项目,代理来源是抓取一些免费的代理发布网站.上午有个小哥告诉我说有个代理抓取接口不能用了,返回状态521.抱着帮人解决问题的心态去跑了一遍代码.发现果真是这样. ...
- java===java基础学习(10)---对象构造
重载 如果多个方法有相同的名字,不同的参数,便产生了重载.编译器必须挑选出具体执行哪个方法,他通过用各个方法给出的参数类I型那个与特定方法调用所使用的值类型进行匹配来挑选出相应的方法.如果编译器找不到 ...
- 系统调用wait()
进程一旦调用了 wait,就 立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回: ...
- FineReport——JS二次开发(CSS改变控件样式)
FR提供一些选择器,可以改变部分控件的样式,那么对于如何书写自己的css: 可以自己写css文件导入,也可以在页面加载结束事件中添加JS方法来改变css样式. 以文本框为例: 书写css文件,保存至% ...
- python的多线程、多进程代码示例
python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...