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

题面

BZOJ

题解

直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给每个数记录一下和它相等的上一个位置和下一个位置,那么这两个位置的限定范围就在区间以外,于是变成了一个\(4\)维数点问题,直接\(KD-Tree\)了。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define inf 1000000000
#define ls t[o].ch[0]
#define rs t[o].ch[1]
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,lt[MAX],b[MAX],rt,D;
struct Node{int d[4];}a[MAX];
struct KDNode{int mn[4],mx[4],ch[4];Node a;}t[MAX];
bool operator<(Node a,Node b){return a.d[D]<b.d[D];}
void cmin(int &x,int y){x=min(x,y);}
void cmax(int &x,int y){x=max(x,y);}
void pushup(int x,int y)
{
for(int i=0;i<4;++i)
cmin(t[x].mn[i],t[y].mn[i]),cmax(t[x].mx[i],t[y].mx[i]);
}
int Build(int l,int r,int nd)
{
D=nd;int o=(l+r)>>1;nth_element(&a[l],&a[o],&a[r+1]);
t[o].mn[0]=t[o].mx[0]=t[o].a.d[0]=a[o].d[0];
t[o].mn[1]=t[o].mx[1]=t[o].a.d[1]=a[o].d[1];
t[o].mn[2]=t[o].mx[2]=t[o].a.d[2]=a[o].d[2];
t[o].mn[3]=t[o].mx[3]=t[o].a.d[3]=a[o].d[3];
if(l<o)ls=Build(l,o-1,(nd+1)%4),pushup(o,ls);
if(r>o)rs=Build(o+1,r,(nd+1)%4),pushup(o,rs);
return o;
}
bool check(Node l,Node r,Node a)
{
for(int i=0;i<4;++i)
if(!(l.d[i]<=a.d[i]&&a.d[i]<=r.d[i]))
return false;
return true;
}
int ans;
Node L,R;
void Query(int o)
{
for(int i=0;i<4;++i)if(t[o].mn[i]>R.d[i]||t[o].mx[i]<L.d[i])return;
if(check(L,R,t[o].a))L.d[2]=max(L.d[2],t[o].a.d[2]);
if(ls)Query(ls);if(rs)Query(rs);
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)
{
b[i]=read();
a[i]=(Node){{lt[b[i]],i,b[i],0}};
lt[b[i]]=i;
}
for(int i=1;i<=n;++i)lt[i]=n+1;
for(int i=n;i>=1;--i)
{
a[i].d[3]=lt[b[i]];
lt[b[i]]=i;
}
rt=Build(1,n,0);
while(m--)
{
int l=(read()+ans)%n+1,r=(read()+ans)%n+1;
if(l>r)swap(l,r);
L=(Node){0,l,0,r+1};
R=(Node){l-1,r,inf,n+1};
Query(rt);
printf("%d\n",ans=L.d[2]);
}
return 0;
}

【BZOJ3489】A simple rmq problem(KD-Tree)的更多相关文章

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

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

  2. 【BZOJ3489】A simple rmq problem

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

  3. 【bzoj3489】 A simple rmq problem

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

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

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

  5. 【bzoj3489】A simple rmq problem 三维KD-tree

    题目描述 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会 ...

  6. 【BZOJ3489】A simple rmq problem【kd树】

    题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...

  7. 【BZOJ】【3489】A simple rmq problem

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

  8. bzoj3489: A simple rmq problem (主席树)

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  9. 【HDOJ5974】A Simple Math Problem(构造,解方程)

    题意:给定A与B,要求构造出一组X,Y,使得X+Y=A,lcm(X,Y)=B A<=2e4,B<=1e9 思路:A的范围较小,考虑以A为突破口 枚举A的约数k,复杂度O(sqrt(A)) ...

随机推荐

  1. cf244D. Match &amp; Catch 字符串hash (模板)或 后缀数组。。。

    D. Match & Catch 能够用各种方法做.字符串hash.后缀数组,dp.拓展kmp,字典树.. . 字符串hash(模板) http://blog.csdn.net/gdujian ...

  2. 树上三角形 BZOJ3251

    分析: 模拟赛T3,其实很水,当时出于某些原因,没有去写这道题... len>46必定有解 为了满足不是三角形,那么斐波那契数列是最优选择,而斐波那契数列的第46项超过了2^31-1,所以超过4 ...

  3. 基于TLS证书手动部署kubernetes集群(下)

    一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已经部署好了etcd集群.flannel网络以及每个节点的docker,接下来部署master节 ...

  4. 20155301 Exp4 恶意代码分析

    20155301 Exp4 恶意代码分析 实践目标 (1) 是监控你自己系统的运行状态,看有没有可疑的程序在运行. (2) 是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用 ...

  5. 20155333 《网络对抗》 Exp6 信息搜集与漏洞扫描

    20155333 <网络对抗> Exp6 信息搜集与漏洞扫描 基础问题 哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和 ...

  6. 杂谈---小故事小道理,面试中的小技巧(NO.2)

    本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...

  7. Mvc4_语法基础介绍

    @model MvcApplicationTest.Models.User @{ ViewBag.Title = "Index"; } <script type=" ...

  8. 联想拯救者15-isk安装固态硬盘与系统迁移教程

    一.固态选择 首先知道拯救者15-ISK是m.2接口2280尺寸,支持PCIE协议NVMe接口标准.我加装的固态是HP EX900系列250G M.2 NVMe固态硬盘. 二.开盖安装 1.拯救者15 ...

  9. 基于tensorflow使用全连接层函数实现多层神经网络并保存和读取模型

    使用之前那个格式写法到后面层数多的话会很乱,所以编写了一个函数创建层,这样看起来可读性高点也更方便整理后期修改维护 #全连接层函数 def fcn_layer( inputs, #输入数据 input ...

  10. Redis学习笔记之单机实现

    1.数据库 Redis的所有数据库都保存在redisServer.db数组中,数据库主要是由两个字典组成:dict字典,负责保存键值对:expires,负责保存键的过期时间 Redis使用惰性删除和定 ...