bzoj3489
kdtree
3维kdtree,就是三个维度轮换着切,我们把每个元素看成一个点,坐标是上次出现的位置,下次出现的位置,自己的位置,第一个<l,第二个>r,第三个[l,r],然后kdtree上爆搜剪枝就行了。
kdtree看起来能解决所有偏序问题。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + , inf = 1e9;
int rd()
{
int x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
int n, m, root, d, ans;
int last[N];
struct data {
int p[], mn[], mx[], lc, rc, ans, val;
bool friend operator < (const data &a, const data &b) {
if(a.p[d] != b.p[d]) return a.p[d] < b.p[d];
if(a.p[(d + ) % ] != b.p[(d + ) % ]) return a.p[(d + ) % ] < b.p[(d + ) % ];
if(a.p[(d + ) % ] != b.p[(d + ) % ]) return a.p[(d + ) % ] < b.p[(d + ) % ];
}
} a[N];
void update(int x)
{
int lc = a[x].lc, rc = a[x].rc;
for(int i = ; i < ; ++i)
{
a[x].mn[i] = min(a[x].p[i], min(a[lc].mn[i], a[rc].mn[i]));
a[x].mx[i] = max(a[x].p[i], max(a[lc].mx[i], a[rc].mx[i]));
}
a[x].ans = max(a[x].val, max(a[lc].ans, a[rc].ans));
}
int build(int l, int r, int D)
{
if(l > r) return ;
d = D;
int mid = (l + r) >> ;
nth_element(a + l, a + mid, a + r + );
a[mid].lc = build(l, mid - , (D + ) % );
a[mid].rc = build(mid + , r, (D + ) % );
update(mid);
return mid;
}
bool out(int k, int l, int r)
{
return ans < a[k].ans && a[k].mn[] <= r && a[k].mx[] >= l && a[k].mn[] < l && a[k].mx[] > r;
}
void query(int k, int l, int r)
{
if(!k || !out(k, l, r)) return;
if(a[k].mx[] <= r && a[k].mn[] >= l && a[k].mx[] < l && a[k].mn[] > r)
{
ans = max(ans, a[k].ans);
return;
}
if(a[k].p[] <= r && a[k].p[] >= l && a[k].p[] < l && a[k].p[] > r) ans = max(ans, a[k].val);
query(a[k].lc, l, r);
query(a[k].rc, l, r);
}
int main()
{
for(int i = ; i < ; ++i) a[].mn[i] = inf, a[].mx[i] = a[].ans = -inf;
n = rd();
m = rd();
for(int i = ; i <= n; ++i)
{
a[i].val = rd();
a[i].p[] = i;
a[i].p[] = last[a[i].val];
a[last[a[i].val]].p[] = i;
last[a[i].val] = i;
}
for(int i = ; i <= n; ++i)
if(!a[i].p[])
a[i].p[] = n + ;
root = build(, n, );
while(m--)
{
int l = (rd() + ans) % n + , r = (rd() + ans) % n + ;
if(l > r) swap(l, r);
ans = ;
query(root, l, r);
printf("%d\n", ans);
}
return ;
}
bzoj3489的更多相关文章
- 【BZOJ3489】A simple rmq problem(KD-Tree)
[BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给 ...
- 【bzoj3489】 A simple rmq problem
http://www.lydsy.com/JudgeOnline/problem.php?id=3489 (题目链接) 题意 在线求区间不重复出现的最大的数. Solution KDtree竟然能够处 ...
- 【BZOJ3489】A simple rmq problem
[BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...
- BZOJ3489 A simple rmq problem 【可持久化树套树】*
BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...
- 【kd-tree】bzoj3489 A simple rmq problem
Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]),其中 i 满足(pre ...
- 【BZOJ3489】A simple rmq problem kd-tree
[BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...
- BZOJ3489: A simple rmq problem
设$i$的前驱为$p_i$,后继为$q_i$,把询问看成点$(L,R)$,有贡献的$i$满足$L\in(p_i,i]$且$R\in[i,q_i)$,询问的就是覆盖这个点的矩形的最大值.那么可以用可持久 ...
- bzoj3489 A simple rmq problem 可持久化树套树
先预处理出两个个数组pre,next.pre[i]表示上一个与i位置数字相同的位置,若不存在则设为0:next[i]表示下一个与i位置数字相同的位置,若不存在则设为n+1.那么一个满足在区间[L,R] ...
- BZOJ3489 A simple rmq problem K-D Tree
传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...
- 【bzoj3489】 A simple rmq problem k-d树
由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...
随机推荐
- OpenCV for Python 学习笔记 二
今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/ ...
- Spring Cloud(十):服务网关zuul(转)
前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...
- 基于flask做权限控制
和Django实现的原理类似,有时间补充
- muduo::Connector、TcpClient分析
Connector TcpClient Connector Connector用来发起连接. 在非堵塞网络中,主动发起连接比被动接收连接更为复杂,由于要考虑错误处理,还要考虑重试. 主要难点在于 1. ...
- kubernetes容器编排之定义环境变量以及通过downwardapi把pod信息作为环境变量传入容器内
系列目录 在学习docker的时候,大家可能经常看到不少示例在docker run的时候指定环境变量(比如wordpress的docker示例就是通过环境变量传入账户和密码到容器内).这里之所以经常用 ...
- Apcahe Shiro学习笔记(一):简介及运行官方Demo
一.Apache Shrio: apache shiro 是一个功能强大和易于使用的Java安全框架,为开发人员提供一个直观而全面的的解决方案的认证,授权,加密,会话管理. 支持认证跨一个或多个数据源 ...
- BUAAOO P13-P14 UML Interaction
- C# GetHashCode 的实现方式
在项目中,在使用哈希表时.有时会须要Override GetHashCode. 这里给出一种普遍的做法: 版本号1:实现一个helper.传递类型T.返回这个类型的hashcode.函数逻辑非常直接, ...
- Python标准库:内置函数set([iterable])
本函数是从迭代对象生成集合.集合能够添加或删除元素. 样例: #set() tset = set([1, 2, 3, 3, 4, 5, 6, 6]) print(tset) tset.add(20) ...
- jquery 通过ajax 提交表单
1.需要引入以下两个js文件 <script src="Easyui/jquery-1.7.2.min.js"></script> <scrip ...