题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3489

题意:一个数列。每次询问一个区间内出现一次的最大的数字是多少。

思路:设last[i]表示i位置的数字上一次出现的位置,next[i]类似。那么询问区间[L,R]时,这个区间的哪些数字可以只出现一次呢?是那些last值小于L且next值大于R的数字。因此按照last排序后,按照last可持久化。具体看代码吧 不好说

const int N=100005;

struct node
{
int val,last,next,id;
}; node b[N];
int last[N],next[N],n,m; struct Node1
{
int Max;
int L,R;
}; struct Node2
{
int root;
int L,R;
}; Node1 A[40000005];
Node2 a[N*20];
int ANum,aNum; int cmp(node a,node b)
{
return a.last<b.last;
} int root[N]; void insert1(int &t,int L,int R,int pos,int val)
{
int cur=++ANum;
A[cur]=A[t];
t=cur;
A[t].Max=max(A[t].Max,val); if(L==R) return; int M=(L+R)>>1;
if(pos<=M) insert1(A[t].L,L,M,pos,val);
else insert1(A[t].R,M+1,R,pos,val);
} void insert(int &t,int L,int R,int posX,int posY,int val)
{
int cur=++aNum;
a[cur]=a[t];
t=cur;
insert1(a[t].root,1,n,posY,val);
if(L==R) return;
int M=(L+R)>>1;
if(posX<=M) insert(a[t].L,L,M,posX,posY,val);
else insert(a[t].R,M+1,R,posX,posY,val);
} int query1(int t,int L,int R,int ll,int rr)
{
if(!t) return 0;
if(L==ll&&R==rr) return A[t].Max;
int M=(L+R)>>1;
if(rr<=M) return query1(A[t].L,L,M,ll,rr);
if(ll>M) return query1(A[t].R,M+1,R,ll,rr);
int ans1=query1(A[t].L,L,M,ll,M);
int ans2=query1(A[t].R,M+1,R,M+1,rr);
return max(ans1,ans2);
} int query(int t,int L,int R,int ll,int rr,int ll1,int rr1)
{
if(L==ll&&R==rr) return query1(a[t].root,1,n,ll1,rr1);
int M=(L+R)>>1;
if(rr<=M) return query(a[t].L,L,M,ll,rr,ll1,rr1);
if(ll>M) return query(a[t].R,M+1,R,ll,rr,ll1,rr1);
int ans1=query(a[t].L,L,M,ll,M,ll1,rr1);
int ans2=query(a[t].R,M+1,R,M+1,rr,ll1,rr1);
return max(ans1,ans2);
} int main()
{
//FFF; n=getInt(); m=getInt();
int i;
for(i=1;i<=n;i++) b[i].val=getInt(),b[i].id=i,last[i]=0,next[i]=n+1;
for(i=1;i<=n;i++)
{
b[i].last=last[b[i].val];
last[b[i].val]=i;
}
for(i=n;i>=1;i--)
{
b[i].next=next[b[i].val];
next[b[i].val]=i;
}
sort(b+1,b+n+1,cmp);
int j=1;
for(i=0;i<n;i++)
{
if(i) root[i]=root[i-1];
while(j<=n&&b[j].last==i)
{
insert(root[i],0,n+1,b[j].next,b[j].id,b[j].val);
j++;
}
} int ans=0;
while(m--)
{
int L=getInt();
int R=getInt();
L=(L+ans)%n+1;
R=(R+ans)%n+1;
if(L>R) swap(L,R);
ans=query(root[L-1],0,n+1,R+1,n+1,L,R);
printf("%d\n",ans);
}
}

BZOJ 3489 A simple rmq problem(可持久化线段树)的更多相关文章

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

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

  2. bzoj 3489: A simple rmq problem k-d树思想大暴力

    3489: A simple rmq problem Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 551  Solved: 170[Submit][ ...

  3. BZOJ 3489: A simple rmq problem

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

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

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

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

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

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

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

  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 (KD-tree做法)

    KD树水过这道可持久化树套树-其实就是个三维偏序 题解戳这里 CODE #include <bits/stdc++.h> using namespace std; #define ls ( ...

  9. BZOJ.3489.A simple rmq problem(主席树 Heap)

    题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...

随机推荐

  1. logstash5.x改变

    5.x版本 logstash中 elasticsearch插件的workers,无法配置大于1,会提示 This plugin uses the shared and doesn't need thi ...

  2. EBS 密码相关

    SELECT usr.user_name, apps.cux_fnd_web_sec.decrypt ((SELECT (SELECT apps.cux_fnd_web_sec.decrypt (fn ...

  3. OpenCV 简介

    自版本OpenCV2.2开始,OpenCV库便被划分为多个模块.这些模块编译成库文件后,位于lib文件夹中. opencv_core模块,包含核心功能,尤其是底层数据结构和算法函数. opencv_i ...

  4. plsql 简单介绍

    plsql的安装: 1. 安装plsql developer 2. 下载,解压instantclient到任意目录 3. 在instantclient解压目录下,新建NETWORK目录,在该目录下建A ...

  5. linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现【转】

    本文转自自:http://blog.chinaunix.net/uid-25014876-id-59418.html linux设备驱动归纳总结(三):3.设备驱动面向对象思想和lseek的实现 一. ...

  6. printf,sprintf,vsprintf 区别【转】

    转自:http://blog.csdn.net/anye3000/article/details/6593551 有C语言写作历史的程序员往往特别喜欢printf 函数.即使可以使用更简单的命令(例如 ...

  7. shell获取目录下最新的文件,文件是以日期命名

    如果你为每个文件按日期命名的格式都一致的话,那么 "ls -l" 命令列出的文件列表就是默认按文件名称(日期先后)排序的.那么最后一个就是最新的,文件名可以用以下方式获取.file ...

  8. Multi-source Replication

    MariaDB starting with 10.0.1 Multi-source replication means that one server has many masters from wh ...

  9. php socket 客户端代码

    <?php class SendDevAction{ //log日志文件 private $logDevFile = ""; //日志字符串 private $logStr ...

  10. Asp.net Vnext IValueProvider

    概述 本文已经同步到<Asp.net Vnext 系列教程 >中] IValueProvider 根据ValueProvider获取数据,在对数据进行绑定 代码实现 private cla ...