BZOJ3489 A simple rmq problem 【可持久化树套树】*

BZOJ3489 A simple rmq problem


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


还是吐槽一下BZOJ的土豆(评测机),什么数组开小了显示WA,数组开大一点就CE,这可真是友好,请问RE呢?MLE呢?????????


然后讲讲这题思路
一开始看到以为是树套树套树
蒙圈了
想了⑩分钟无果然后就去看题解
结果发现可以用排序的方法把三维降成两维

只不过嘛。需要可持久化
不过我们不虚
可持久化树套树不就是在可持久化线段树上多加一句插入吗理直气壮
首先我们考虑一个数在区间内出现一次的充要条件是什么
1.l<=posi<=r1.l<=posi<=r
2.l>prei2.l>prei
3.r<nxti3.r<nxti
其中pos表示位置,pre和nxt分别表示上一个和下一个这个数出现的位置
很妙啊
我们考虑以pre为键值排序
然后我们发现我们查询的区间变成了一个前缀
所以就将pre可持久化一下
然后我们又发现nxt也是我们的限制条件
所以我们在外层的树上以nxt为下标,所以查询就变成了在线段树上查询后缀

但是还有pos的限制怎么办?
所以就把内层树搞成原序列的位置就好了
然后查询的时候非常套路地二分一下pre的位置,剩下的该怎么查怎么查


#include<bits/stdc++.h>
using namespace std;
inline int read(){int ans=0,w=1;char c=getchar();while(!isdigit(c)&&c!='-')c=getchar();if(c=='-')w=-1,c=getchar();while(isdigit(c))ans=(ans<<1)+(ans<<3)+c-'0',c=getchar();return ans*w;
}
#define N 100010
int n,m,lastans=0;
struct Node{int val,pos,pre,nxt;}p[N];
bool cmp(Node a,Node b){return a.pre<b.pre;}
//inside 原序列顺序
int ld[N*350],rd[N*350],maxv[N*350];
int cnt=0;
void insert(int &t,int last,int l,int r,int pos,int vl){t=++cnt;maxv[t]=max(vl,maxv[last]);if(l==r)return;ld[t]=ld[last];rd[t]=rd[last];int mid=(l+r)>>1;if(pos<=mid)insert(ld[t],ld[last],l,mid,pos,vl);else insert(rd[t],rd[last],mid+1,r,pos,vl);
}
int query(int t,int l,int r,int L,int R){if(!t)return 0;if(L<=l&&r<=R)return maxv[t];int mid=(l+r)>>1;if(R<=mid)return query(ld[t],l,mid,L,R);if(L>mid)return query(rd[t],mid+1,r,L,R);return max(query(ld[t],l,mid,L,R),query(rd[t],mid+1,r,L,R));
}
//outside nxt顺序
int rt[N*20],lc[N*20],rc[N*20],tot=0;
void insert(int &t,int last,int l,int r,int key,int pos,int vl){t=++tot;insert(rt[t],rt[last],1,n,pos,vl);if(l==r)return;lc[t]=lc[last];rc[t]=rc[last];int mid=(l+r)>>1;if(key<=mid)insert(lc[t],lc[last],l,mid,key,pos,vl);else insert(rc[t],rc[last],mid+1,r,key,pos,vl);
}
int query(int t,int l,int r,int L,int R,int ql,int qr){if(!t)return 0;if(L<=l&&r<=R)return query(rt[t],1,n,ql,qr);int mid=(l+r)>>1;if(R<=mid)return query(lc[t],l,mid,L,R,ql,qr);if(L>mid)return query(rc[t],mid+1,r,L,R,ql,qr);return max(query(lc[t],l,mid,L,R,ql,qr),query(rc[t],mid+1,r,L,R,ql,qr));
}
int outrt[N];
int pre[N],nxt[N];
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)p[i].pos=i,scanf("%d",&p[i].val);for(int i=1;i<=n;i++)pre[i]=0,nxt[i]=n+1;for(int i=1;i<=n;i++)p[i].pre=pre[p[i].val],pre[p[i].val]=i;for(int i=n;i>=1;i--)p[i].nxt=nxt[p[i].val],nxt[p[i].val]=i;//for(int i=1;i<=1000;i++)cout<<i<<" "<<p[i].pre<<" "<<p[i].nxt<<endl;sort(p+1,p+n+1,cmp);for(int i=1;i<=n;i++)//持久化pre的顺序insert(outrt[i],outrt[i-1],1,n+1,p[i].nxt,p[i].pos,p[i].val);for(int i=1;i<=m;i++){int l,r;scanf("%d%d",&l,&r);l=(l+lastans)%n+1;r=(r+lastans)%n+1;if(l>r)swap(l,r);int ql=1,qr=n,tmp=0;while(ql<=qr){int mid=(ql+qr)>>1;if(p[mid].pre<l)ql=mid+1,tmp=mid;else qr=mid-1;}printf("%d\n",lastans=query(outrt[tmp],1,n+1,r+1,n+1,l,r));}return 0;
}

转载于:https://www.cnblogs.com/dream-maker-yk/p/9676288.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode--319. 灯泡开关

初始时有 n 个灯泡关闭。 第 1 轮&#xff0c;你打开所有的灯泡。 第 2 轮&#xff0c;每两个灯泡你关闭一次。 第 3 轮&#xff0c;每三个灯泡切换一次开关&#xff08;如果关闭则开启&#xff0c;如果开启则关闭&#xff09;。第 i 轮&#xff0c;每 i 个灯泡切换一次开关。 …

Eclipse中tomcat的简单配置

Eclipse中tomcat的简单配置 将Eclipse与tomcat相关联 如果下拉选项中没有jdk1.8.0_131&#xff0c;就点击后面的选项 把服务器视图调出来&#xff0c;方便之后调试 将tomcat服务器调入 如果要添加项目&#xff0c;点击右键&#xff0c;选择Add and Remove… 最后&#xff0…

AI智能体学会动物进化法则:李飞飞等提出深度进化RL

来源&#xff1a;机器之心编辑&#xff1a;杜伟、魔王、陈萍在过去 6 亿年中&#xff0c;进化带来了不同类型的「无尽之形最美」&#xff08;endless forms most beautiful&#xff09;&#xff0c;从古老的两侧对称虫到多种多样的动物形态。这些动物还展示出了显著的具身智能&…

Leetcode--22. 括号生成

给出 n 代表生成括号的对数&#xff0c;请你写出一个函数&#xff0c;使其能够生成所有可能的并且有效的括号组合。 例如&#xff0c;给出 n 3&#xff0c;生成结果为&#xff1a; [ "((()))", "(()())", "(())()", "()(())&quo…

DevExpress v18.1新版亮点——WPF篇(五)

用户界面套包DevExpress v18.1日前终于正式发布&#xff0c;本站将以连载的形式为大家介绍各版本新增内容。本文将介绍了DevExpress WPF v18.1 的新功能&#xff0c;快来下载试用新版本&#xff01;点击下载>> Spreadsheet Control Spreadsheet Shapes 从简单的线条、矩形…

tomcat修改端口号与eclipse中的tomcat保持一致

tomcat修改端口号与eclipse中的tomcat保持一致 将本地tomcat与eclipse中tomcat的配置信息保持一致&#xff1a;即将eclipse中的tomcat设置为托管模式 1. 添加项目 2. 查看server.xml文件中tomcat的端口号 3. 第一次创建tomcat实例后&#xff0c;双击tomcat服务器&#xff0c;选…

(数据科学学习手札45)Scala基础知识

一、简介 由于Spark主要是由Scala编写的&#xff0c;虽然Python和R也各自有对Spark的支撑包&#xff0c;但支持程度远不及Scala&#xff0c;所以要想更好的学习Spark&#xff0c;就必须熟练掌握Scala编程语言&#xff0c;Scala与Java较为相似&#xff0c;且在Scala中可以调用很…

Leetcode--76. 最小覆盖子串

给你一个字符串 S、一个字符串 T&#xff0c;请在字符串 S 里面找出&#xff1a;包含 T 所有字母的最小子串。 示例&#xff1a; 输入: S "ADOBECODEBANC", T "ABC" 输出: "BANC" 说明&#xff1a; 如果 S 中不存这样的子串&#xff0c;则返…

京东《未来科技趋势白皮书》,101页pdf

来源&#xff1a;专知2020年&#xff0c;疫情震荡全球&#xff0c;经济波动剧烈&#xff0c;无论是国家还是企业&#xff0c;都希望通过把握未来科技“脉搏”&#xff0c;驱散经济下行阴影&#xff0c;实现组织升级迭代。逝者如斯&#xff0c;新的十年&#xff0c;哪些关键技术…

JSP中get和post请求方式的区别及乱码解决方法

JSP中get和post请求方式的区别及乱码解决方法 get提交方式&#xff1a;默认method“get” 和 地址栏、超链接请求方式默认都属于get提交方式 form表单的method属性&#xff1a;提交服务器的http方法&#xff0c;一般为post和get get与post请求方式的区别&#xff1a; get方式 …

RISC-V有何特别之处?

作者&#xff1a;Erik Engheim译者&#xff1a;冬雨整理&#xff1a;陈思20 世纪 90 年代末&#xff0c;RISC 和 CISC 爆发了一场大战&#xff0c;自那以后&#xff0c;大家却说 RISC 和 CISC 的区别没那么重要了了。许多人表示&#xff0c;指令集也就那么回事&#xff0c;对 C…

【剑指offer】面试题21:调整数组顺序使奇数位于偶数前面

题目&#xff1a;&#xff1a;输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分。 代码&#xff1a; package offer; public class ti21 { public static void main…

数据库存取BLOB类型音乐文件的过程及常见错误

数据库存取BLOB类型音乐文件的过程及常见错误 数据库端的准备工作&#xff1a; 新建表&#xff0c;用来存放音乐文件&#xff1a;mymusic 第一列&#xff1a;id 类型&#xff1a;int 第二列&#xff1a;music 类型&#xff1a;blob 将音乐文件存入数据库 /*** */ package cn…

Trie可持久化Trie

WARNING&#xff1a;以下代码未经测试&#xff0c;若发现错误&#xff0c;欢迎指出qwq~ Trie树&#xff08;字典树&#xff09; 一种简单的数据结构&#xff0c;可存储大量字符串&#xff0c;可在$O(len)$的时间内完成插入&#xff0c;删除&#xff0c;查找等操作。 下面是一个…

视觉的目的是什么?从监督学习到对比学习,回顾CV发展史

来源&#xff1a;AI科技评论作者&#xff1a; 周纵苇知乎摘要&#xff1a;视觉&#xff0c;对于人类或动物来说&#xff0c;似乎是一件稀松平常的事情&#xff0c;我们甚至都不需要去有意识地训练自己&#xff0c;就可以天赋一般地认识世界。对于机器而言&#xff0c;理解图片却…

【剑指offer】面试题22:链表中倒数第 K 个节点

题目&#xff1a; 输入一个链表&#xff0c;输出该链表中倒数第k哥结点。为了符合大多数人的习惯&#xff0c;本题从1开始计数&#xff0c;即链表的尾结点是倒数第1个结点。例如一个链表有6个结点&#xff0c;从头结点开始它们的值依次是1&#xff0c;2&#xff0c;3&#xff0…

day7——集合,深浅copy

数据类型的补充 # s1 中国    # b1 s1.encode(utf-8)    # # print(b1)-------------->b\xe4\xb8\xad\xe5\x9b\xbd utf-8 bytes --->gbk bytes    # s2 b1.decode(utf-8)    # # print(s2)---------------中国    # b2 s2.encode(gbk)    #…

MVC原理及案例分析

MVC原理及案例分析 关于MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写&#xff0c;一种软件设计典范&#xff0c;用一种业务逻辑、数据、界面显示分离的方法组织代码&#xff0c;将业务逻辑聚集到…

人工智能的鱼与熊掌:精度与可解释性

来源&#xff1a;陈德旺科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-57940-1270913.html 人工智能自1956年诞生之日&#xff0c;就肩负用计算机程序模拟人类&#xff08;或生物体&#xff09;智能的初心与使命&#xff0c;从而理解智能的工作原理与运作机制…

MVC与三层架构的联系及三层架构实现学生注册功能

MVC与三层架构的联系及三层架构实现学生注册功能 三层架构的逻辑关系&#xff1a; MVC和三层架构的联系&#xff1a; 三层架构实现学生注册功能的逻辑&#xff1a; 学生注册页面&#xff1a; 输入学生信息&#xff1a; 完成学生注册: 代码实现&#xff1a; add.jsp <% …