【BZOJ3489】A simple rmq problem(KD-Tree)
【BZOJ3489】A simple rmq problem(KD-Tree)
题面
题解
直接做肯定不好做,首先我们知道我们是一个二维平面数点,但是限制区间只能出现一次很不好办,那么我们给每个数记录一下和它相等的上一个位置和下一个位置,那么这两个位置的限定范围就在区间以外,于是变成了一个\(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)的更多相关文章
- 【BZOJ3489】A simple rmq problem kd-tree
[BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...
- 【BZOJ3489】A simple rmq problem
[BZOJ3489]A simple rmq problem 题面 bzoj 题解 这个题不强制在线的话随便做啊... 考虑强制在线时怎么搞 预处理出一个位置上一个出现的相同数的位置\(pre\)与下 ...
- 【bzoj3489】 A simple rmq problem
http://www.lydsy.com/JudgeOnline/problem.php?id=3489 (题目链接) 题意 在线求区间不重复出现的最大的数. Solution KDtree竟然能够处 ...
- 【bzoj3489】 A simple rmq problem k-d树
由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...
- 【bzoj3489】A simple rmq problem 三维KD-tree
题目描述 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会 ...
- 【BZOJ3489】A simple rmq problem【kd树】
题意 给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. 分析 预处理 ...
- 【BZOJ】【3489】A simple rmq problem
KD-Tree(乱搞) Orz zyf教给蒟蒻做法 蒟蒻并不会这题正解……(可持久化树套树?...Orz 对于每个点,我们可以求出pre[i],nex[i],那么询问的答案就是:求max (a[i]) ...
- bzoj3489: A simple rmq problem (主席树)
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- 【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)) ...
随机推荐
- MS SQL Server字符拆分函数
Insus.NET以前有用XQuery的nodes()方法写过一个函数,是MS SQL字符拆分的函数,http://www.cnblogs.com/insus/archive/2012/02/26/2 ...
- 基于Azure的软件部署和开发系列沙龙
活动简介: Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用.它开放式的架构给开发者提供了Web应用.互联设备的应用.个人电脑.服务器.或者提供 ...
- jQuery.bsgrid
http://thebestofyouth.com/bsgrid/ 支持json.xml数据格式,皮肤丰富并且容易定制,支持表格编辑.本地数据.导出参数构建等实用便捷的功能,容易扩展,更拥有丰富的示例 ...
- oracle10g安装在裸设备上
参考了百度文库上的 <在裸设备上面安装oracle10g> 一文. 不过为了简单起见,我选择OS 为 Redhat AS 4.8 32位. 准备安装数据库为 ...
- 在git与tortoisegit中使用openSSH与PuTTY
问题 在使用Git与tortoisegit的时候,指定远程版本库的地址有2种方式: 使用https方式的git地址非常直接(https://xxx.oschina.net/xxx.git),基本上什么 ...
- 苹果电脑获取Android Studio的发布版SHA1和开发版SHA1
最近开始转战安卓,准备把我在苹果上的应用也在安卓上来一波,其中就遇到一个问题就是最牛天气(iOS和微信小程序都已经有了,就差安卓的了)引用的百度的定位功能,需要填写发布版SHA1和开发版SHA1,作为 ...
- unity物理检测的几种方式
(由于本人大多做2d游戏,因此以下以2d为主介绍,但是具体和3d相差不大) 在unity中有很多不同的物理检测方式,但是大致可以分为以下几种: 1.Physics2d检测系列 Physics2d.Li ...
- FFMpeg笔记(六) 滤镜命名规则及使用libavfilter对视频尺寸进行裁切
在ffmpeg框架中,滤镜(filter)功能通过libavfilter库实现. 一个filter可以同时有多个输入和输出.以图为例: 图中的一系列操作共使用了四个filter,分别是 spli ...
- 基于tensorflow2.0 使用tf.keras实现Fashion MNIST
本次使用的是2.0测试版,正式版估计会很快就上线了 tf2好像更新了蛮多东西 虽然教程不多 还是找了个试试 的确简单不少,但是还是比较喜欢现在这种写法 老样子先导入库 import tensorflo ...
- TCP三路握手,本质是一个通信原理相关的问题
在通信系统中,最基本的信息的传递都需要两步,发送方发送的消息和对方的回复确认:A->B Send, B->A Reply(ACK).如果多接触一下其他行业的通信流程和规范,例如航空.铁路调 ...