【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. Android应用安全之脆弱的加密

    程序员希望通过加密来提升程序的安全性性,但却缺乏专业的密码学背景知识,使得应用对数据的保护非常薄弱.本文将介绍可能出现在Android应用中的一些脆弱的加密方式,以及对应的攻击方法. 造成脆弱加密的主 ...

  2. 20155233 《网络对抗》Exp4 恶意代码分析

    使用schtasks指令监控系统运行 先在C盘目录下建立一个netstatlog.bat文件,用来将记录的联网结果格式化输出到netstatlog.txt文件中,netstatlog.bat内容为: ...

  3. 20155310 《网络攻防》Exp4 恶意代码分析

    20155310 <网络攻防>Exp4 恶意代码分析 基础问题 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些, ...

  4. 搭建SpringBoot、Jsp支持学习笔记

    Spring Boot 添加JSP支持 大体步骤: (1)            创建Maven web project: (2)            在pom.xml文件添加依赖: (3)     ...

  5. stl源码剖析 详细学习笔记 RB_tree (1)

    // //  RB_tree_STL.cpp //  笔记 // //  Created by fam on 15/3/21. // // #include "RB_tree_STL.h&q ...

  6. setBit testBit权限管理

    1.jdk7文档解释 public boolean testBit(int n) Returns true if and only if the designated bit is set. (Com ...

  7. 如何设计一个异步Web服务——任务调度

    接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...

  8. manjaro设置国内源

    升级系统到最新 sudo pacman -Syyu 配置源 kate /etc/pacman.conf 官方镜像源(包括 core, extra, community, multilib ) sudo ...

  9. 501. Find Mode in Binary Search Tree【LeetCode by java】

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

  10. c# 导出数据到excel

    直接上代码: private void button1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButton ...