3489: A simple rmq problem

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 551  Solved: 170
[Submit][Status][Discuss]

Description

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

Input

第一行为两个整数N,M。M是询问数,N是序列的长度(N<=100000,M<=200000)

第二行为N个整数,描述这个序列{ai},其中所有1<=ai<=N

再下面M行,每行两个整数x,y,

询问区间[l,r]由下列规则产生(OIER都知道是怎样的吧>_<):

l=min((x+lastans)mod n+1,(y+lastans)mod n+1);

r=max((x+lastans)mod n+1,(y+lastans)mod n+1);

Lastans表示上一个询问的答案,一开始lastans为0

Output

一共M行,每行给出每个询问的答案。

Sample Input

10 10
6 4 9 10 9 10 9 4 10 4
3 8
10 1
3 4
9 4
8 1
7 8
2 9
1 1
7 3
9 9

Sample Output

4
10
10
0
0
10
0
4
0
4

HINT

注意出题人为了方便,input的第二行最后多了个空格。

  曾经以为这是自己一道原创题啊,直到在bzoj发现了这道题。。。

  某日学姐问了一道这个问题的离线版,然后说正解是裸裸的O(nlogn)线段树,然后就都不会了,O(nlogn)的解法我还是怀疑不存在的,不过线段树套set到是没啥问题的。

  然后另一日,hja表示这道题可以出成在线版,问数据范围,n=3*10^5.

  于是乎hja自己的程序被卡mle了,然而本人蒟蒻,更本不想写主席树套可持久化Treap,于是乎yy出了这个O(n^2)算法。

  考虑离线询问,按照r排序,对于每一个权值,我们在线段树的对应位置存下它有贡献的区间(即prv[prv[x]]+1到prv[x])对于一个权值区间,我们存下所有权值所对应的贡献区间的L-min和R-max。对于R确定的询问(L,R)我们只需要在线段树上找到最大的权值,使其区间包含L,于是我们优先递归权值大的一边,找到及退出,如果当前权值区间的(L-min,R-max)已经不可能包含L值了,那么也直接退出,这个和k-d树的find机制非常像。

  离线我们只需要一个线段树,那么在线的话把线段树换成主席树就ok啦。

  发现bzoj数据范围只有10^5,一交rank2!!!!加上读入优化1960ms的rank1!!!!

  爽。。。。暴力虐标程。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100100
#define MAXT MAXN*25
#define INF 0x3f3f3f3f
#define smid ((l+r)>>1)
inline int nextInt()
{
register char ch;
register int x=;
while (ch=getchar(),ch<'' || ch>'');
while (x=x*+ch-'',ch=getchar(),ch<='' && ch>='');
return x;
}
struct sgt_node
{
int lc,rc;
int mn,mx;
sgt_node()
{
mn=INF;
mx=-INF;
}
}sgt[MAXT];
int topt=;
int Modify_sgt(int now,int l,int r,int pos,int v1,int v2)
{
sgt[++topt]=sgt[now];
now=topt;
if (l==r)
{
sgt[now].mn=v1;
sgt[now].mx=v2;
return now;
}
if (pos<=smid)
sgt[now].lc=Modify_sgt(sgt[now].lc,l,smid,pos,v1,v2);
else
sgt[now].rc=Modify_sgt(sgt[now].rc,smid+,r,pos,v1,v2);
sgt[now].mn=min(sgt[sgt[now].lc].mn,sgt[sgt[now].rc].mn);
sgt[now].mx=max(sgt[sgt[now].lc].mx,sgt[sgt[now].rc].mx);
return now;
}
int Query_sgt(int now,int l,int r,int v)
{
if (l==r)
return v<=sgt[now].mx && v>=sgt[now].mn?l:;
int ret=;
if (sgt[sgt[now].rc].mn<=v && sgt[sgt[now].rc].mx>=v)
{
ret=Query_sgt(sgt[now].rc,smid+,r,v);
if (ret)return ret;
}
return Query_sgt(sgt[now].lc,l,smid,v);
}
int a[MAXN];
int tmp[MAXN];
int prv[MAXN];
int root[MAXN]; int main()
{
//freopen("seq0.in","r",stdin);
//freopen("seq10.out","w",stdout);
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int n,m,x,y,z;
n=nextInt(),m=nextInt();
for (int i=;i<=n;i++)
a[i]=nextInt();
for (int i=;i<=n;i++)
{
prv[i]=tmp[a[i]];
tmp[a[i]]=i;
}
for (int i=;i<=n;i++)
root[i]=Modify_sgt(root[i-],,n,a[i],prv[i]+,i);
int lastans=;
int aa,bb;
for (int i=;i<m;i++)
{
aa=nextInt(),bb=nextInt();
x=min((aa+lastans)%n+,(bb+lastans)%n+);
y=max((aa+lastans)%n+,(bb+lastans)%n+);
printf("%d\n",lastans=Query_sgt(root[y],,n,x));
}
}

bzoj 3489: A simple rmq problem k-d树思想大暴力的更多相关文章

  1. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MBSubmit: 1594  Solved: 520[Submit] ...

  2. [BZOJ 3489] A simple rmq problem 【可持久化树套树】

    题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...

  3. bzoj 3489 A simple rmq problem - 线段树

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

  4. BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...

  5. bzoj 3489 A simple rmq problem——主席树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...

  6. BZOJ 3489 A simple rmq problem(可持久化线段树)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3489 题意:一个数列.每次询问一个区间内出现一次的最大的数字是多少. 思路:设la ...

  7. bzoj 3489 A simple rmq problem —— 主席树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...

  8. BZOJ 3489: A simple rmq problem(K-D Tree)

    Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 2579  Solved: 888[Submit][Status][Discuss] Descripti ...

  9. BZOJ 3489 A simple rmq problem ——KD-Tree

    考前写写板子. 用$(i,pre[i],nxt[i])$来描述一个点,然后就变成了区间求最值的问题. KD-Tree 由低维转向高维的方法,可以用来敲暴力. 剩下就是KD-Tree的基本操作了. #i ...

随机推荐

  1. JS获取网页属性包括宽、高等

    JS获取网页属性包括宽.高等. function getInfo()  { // www.jbxue.com var s = "";  s += " 网页可见区域宽:&q ...

  2. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  3. 详解 CSS 属性 - :before && :after

    现在我们经常在 html 源码中看到如下的写法: 这里的 ::after 和 ::before 就是我们今天来探讨的 css 伪元素之二 - :before && :after. 伪元 ...

  4. Ubuntu kylin系统改中文系统文件名为英文

    刚装好系统,将使用语言改成了中文,结果重启后,提示是否将文件系统的名字改为新的,我一不注意,点了是...这样,在以后使用终端的时候,会有中文来干扰,所以需要改回英文. 方法如下: 输入两个命令即可: ...

  5. Python学习教程(learning Python)--2.3.4Python函数返回值

    本节讨论Python函数返回值问题. Python和C语言一样,也可以在函数结束时返回一个值.但在定义自己的Python函数时,是不需要指定返回值数据类型的,这和Python不关心变量的数据类型是一致 ...

  6. flask 开发记录

    from flask import request 判断method方式 request.method  'POST', ‘GET’ 获取form内容 request.form['form_name' ...

  7. 关于activity_main.xml与fragment_main.xml

    第一种解决办法 新版安装SDK文件一开始有两个XML文件,activity_main.xml和fragment_main.xml,不习惯的可以这样处理:1.删除fragment_main.xml整个文 ...

  8. .NET开源工作流RoadFlow-系统布署中常见错误及处理方法

    1.未开启asp.net状态服务时会出现以下错误: 解决办法:开启ASP.NET STATE SERVICE服务 2.未开启应用程序池32位: 解决办法:启用32位

  9. hdu 2091 空心三角形

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2091 空心三角形 Description 把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为 ...

  10. VS2010遇到_WIN32_WINNT宏定义问题

    最近拿到一个别人的工程,是使用VS.net创建的,而我的机器上只有vs2010,于是用自带的转换工具将它转换成vs2010的工程,转换之前我就很担心,怕转换完后会出问题,但是没有办法,我实在是不想再安 ...