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的更多相关文章

  1. 【BZOJ3489】A simple rmq problem(KD-Tree)

    [BZOJ3489]A simple rmq problem(KD-Tree) 题面 BZOJ 题解 直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给 ...

  2. 【bzoj3489】 A simple rmq problem

    http://www.lydsy.com/JudgeOnline/problem.php?id=3489 (题目链接) 题意 在线求区间不重复出现的最大的数. Solution KDtree竟然能够处 ...

  3. 【BZOJ3489】A simple rmq problem

    [BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...

  4. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  5. 【kd-tree】bzoj3489 A simple rmq problem

    Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]),其中 i 满足(pre ...

  6. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  7. BZOJ3489: A simple rmq problem

    设$i$的前驱为$p_i$,后继为$q_i$,把询问看成点$(L,R)$,有贡献的$i$满足$L\in(p_i,i]$且$R\in[i,q_i)$,询问的就是覆盖这个点的矩形的最大值.那么可以用可持久 ...

  8. bzoj3489 A simple rmq problem 可持久化树套树

    先预处理出两个个数组pre,next.pre[i]表示上一个与i位置数字相同的位置,若不存在则设为0:next[i]表示下一个与i位置数字相同的位置,若不存在则设为n+1.那么一个满足在区间[L,R] ...

  9. BZOJ3489 A simple rmq problem K-D Tree

    传送门 什么可持久化树套树才不会写呢,K-D Tree大法吼啊 对于第\(i\)个数,设其前面最后的与它值相同的位置为\(pre_i\),其后面最前的与它值相同的位置为\(aft_i\),那么对于一个 ...

  10. 【bzoj3489】 A simple rmq problem k-d树

    由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...

随机推荐

  1. C语言-回溯例4

    1,问题提出 日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题: 把1,2,...,9这9个数字填入下式的九个方格中(数字不得重复),使下面 ...

  2. Excel应用----制作二级下拉菜单【转】

    应用: 原始数据源是两列的源数据,那该如何制作二级下拉菜单, 当然可以将这两列的数据源,转换成上面的那种格式,再用上面的方法来制作. 今天教大学的方法是直接通过这种两列式的数据源来制作下拉菜单,如果A ...

  3. mysql查询sql中检索条件为大批量数据时处理

    当userIdArr数组值为大批量时,应如此优化代码实现

  4. MongoDB连接数与连接优化

    默认每个连接数占用10M内存 ulimit -a 查看stack size MongoDB服务器内存要满足 connection overhead + data size + index size 即 ...

  5. PythonCookBook笔记——数字日期和时间

    数字日期和时间 数字的四舍五入 用round函数,指定值和小数位数. >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 & ...

  6. 在JS中将JSON的字符串解析成JSON数据格式

    使用eval函数来解析 <script> var data="{root: [{name:'1',value:'0'},{name:'6101',value:'北京市'},{na ...

  7. iOS8的UIPresentationController

    本文转载至 http://kyfxbl.iteye.com/blog/2147888 从iOS8开始,controller之间的跳转特效,需要用新的API UIPresentationControll ...

  8. eacharts 根据后台数据生成柱状图

    说明:开发环境vs2012 ,asp.net mvc4项目,c#语言 1.效果图 2.HTML 前端代码 <%@ Page Language="C#" AutoEventWi ...

  9. Flow 的工作方式 类型检查

    Vue.js 技术揭秘 | Vue.js 技术揭秘 https://ustbhuangyi.github.io/vue-analysis/ Vue技术内幕 http://hcysun.me/vue-d ...

  10. flume采集微信小程序数据

    flume采集微信小程序数据 flume收集前端埋点数据[1]POST请求http://f.x.com:50000数据格式: JsonArray数据格式示例:[{ "headers" ...