bzoj 3489: A simple rmq problem k-d树思想大暴力
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
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
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树思想大暴力的更多相关文章
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- [BZOJ 3489] A simple rmq problem 【可持久化树套树】
题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...
- bzoj 3489 A simple rmq problem - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
- BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...
- bzoj 3489 A simple rmq problem——主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- BZOJ 3489 A simple rmq problem(可持久化线段树)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3489 题意:一个数列.每次询问一个区间内出现一次的最大的数字是多少. 思路:设la ...
- bzoj 3489 A simple rmq problem —— 主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- BZOJ 3489: A simple rmq problem(K-D Tree)
Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2579 Solved: 888[Submit][Status][Discuss] Descripti ...
- BZOJ 3489 A simple rmq problem ——KD-Tree
考前写写板子. 用$(i,pre[i],nxt[i])$来描述一个点,然后就变成了区间求最值的问题. KD-Tree 由低维转向高维的方法,可以用来敲暴力. 剩下就是KD-Tree的基本操作了. #i ...
随机推荐
- 转载字典地址:http://blog.csdn.net/aladdinty/article/details/3591789
相关文章: http://www.360doc.com/content/13/1003/23/14070959_318861279.shtml http://www.360doc.com/conten ...
- Asp.net从文件夹中读取图片,随机背景图
第一步:配置文件web.config里添加 <system.web><connectionStrings> <!--name 是自定义的,connectionString ...
- WordPress 主题开发 - (六) 创建主题函数 待翻译
We’ve got a file structure in place, now let’s start adding things to them! First, we’re going to ad ...
- IOS学习3
@property属性使用 copy:NSString strong: 一般对象 weak: UI空间 assign:基本数据类型 retain: (对象,先上述类型使用) id 万能指针. id缺点 ...
- EmguCV学习——简单使用
关于EmguCV我就不多说了,是对应于OpenCV的一套net库. 公司是视觉方面的业务,我又不会c++(好想会啊,正在学习中).由于各种需求,自己觉得对c++不是特别感冒,所以选用了net下的ope ...
- Windows上搭建android开发环境
在搭建android开发环境时需要四部分内容,框架如下 其中Java SDK和Eclipse在java4android中有过介绍,重点介绍ADT和Android SDK的安装. 安装Android S ...
- Google Chrome浏览器各版本直接下载地址
Google Chrome浏览器各版本直接下载地址 2012.04.12珍藏软件 10161 Views 0 Comments 现在所用的主浏览器Google Chrome,在其官方主页上默认只 ...
- Linux ls -l内容详解
ls -l是列出当前目录下所有文件信息 以下是实例: 具体的文字描述如下: 第1字段: 文件属性字段文件属性字段总共有10个字母组成,第一个字母表示文件类型,如果这个字母是一个减号”-”,则说明该文 ...
- 深度神经网络DNN的多GPU数据并行框架 及其在语音识别的应用
深度神经网络(Deep Neural Networks, 简称DNN)是近年来机器学习领域中的研究热点,产生了广泛的应用.DNN具有深层结构.数千万参数需要学习,导致训练非常耗时.GPU有强大的计算能 ...
- SQL Server 2008 R2 主从数据库同步
一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2 DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...