[bzoj3489]A simple rmq problem_KD-Tree

A simple rmq problem

题目大意:给定一个长度为$n$的序列,给出$m$个询问:在$[l,r]$之间找到一个在这个区间里只出现过一次的最大的数。

注释:$1\le n\le 10^5$,$1\le mle 2\cdot 10^5$。


想法

我的第一想法是莫队。

结果发现是强制在线(离线我也不会...

想了想其实$KD-Tree$还是比较显然的。

我们设$l_i$表示$a_i$上一次出现的位置,$r_i$表示下一次。

紧接着我们把第$i$个数转化为三维坐标轴上的点$(l_i,i,r_i)$。

用$KD-Tree$维护直接查即可。

Code

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010 
using namespace std;
int v[N],lst[N],dic[N],nxt[N],d,l,r,ans,rt;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0,f=1; char c=nc(); while(c<48) {if(c=='-') f=-1; c=nc();} while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;}
inline void Max(int &x,int y) {x=x>y?x:y;}
inline void Min(int &x,int y) {x=x<y?x:y;}
struct Node {int p[3],mx[3],mn[3],ans,size,val,ls,rs;}a[N];
inline bool cmp(const Node &a,const Node &b)
{for(int i=0;i<3;i++) if(a.p[(d+i)%3]!=b.p[(d+i)%3]) return a.p[(d+i)%3]<b.p[(d+i)%3];return true;
}
inline void pushup(int x,int k)
{a[x].size+=a[k].size;for(int i=0;i<3;i++) Max(a[x].mx[i],a[k].mx[i]),Min(a[x].mn[i],a[k].mn[i]);Max(a[x].ans,a[k].ans);
}
int build(int l,int r,int now)
{int mid=(l+r)>>1;d=now; nth_element(a+l,a+mid,a+r+1,cmp);for(int i=0;i<3;i++) a[mid].mx[i]=a[mid].mn[i]=a[mid].p[i];a[mid].ans=a[mid].val;if(l<mid) a[mid].ls=build(l,mid-1,(now+1)%3),pushup(mid,a[mid].ls);if(mid<r) a[mid].rs=build(mid+1,r,(now+1)%3),pushup(mid,a[mid].rs);return mid;
}
bool judge(int x)
{return a[x].ans>ans&&a[x].mx[0]>=l&&a[x].mn[0]<=r&&a[x].mn[1]<l&&a[x].mx[2]>r;
}
void query(int x)
{if(!x||!judge(x)) return;if(a[x].p[0]>=l&&a[x].p[0]<=r&&a[x].p[1]<l&&a[x].p[2]>r) Max(ans,a[x].val);query(a[x].ls); query(a[x].rs);
}
int main()
{int n=rd(),m=rd();for(int i=1;i<=n;i++) v[i]=rd(),lst[i]=dic[v[i]],nxt[dic[v[i]]]=i,dic[v[i]]=i;for(int i=1;i<=n;i++) a[i].p[0]=i,a[i].p[1]=lst[i],a[i].p[2]=nxt[i]?nxt[i]:n+1,a[i].val=v[i];rt=build(1,n,0); while(m--){l=(rd()+ans)%n+1,r=(rd()+ans)%n+1; if(l>r) swap(l,r);ans=0,query(rt); printf("%d\n",ans);}return 0;
}

小结:$KD-Tree$虽然是一个暴力,但是它的思想还是非常不错的。

转载于:https://www.cnblogs.com/ShuraK/p/10243973.html

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

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

相关文章

JSON入门

JSON简介 JSON ( JavaScript Object Notation, JS 对象标记 ) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅…

字符流

字符输入流Reader import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;public class Demo04 {public static void main(String[] args) throws IOException {method1();method2();method3();copy();} FileReader类 //文本文件建议用字符流读取…

Apache服务器下载、安装、启动、关闭及卸载(win版)

今天讲一下64位win7环境下apache服务器的下载、安装及配置的过程。 1、Apache的下载 百度搜索apache&#xff0c;然后单击选择的下载网站&#xff1a; 我选择的是第一个网站&#xff0c;第二个也可以。 进入之后&#xff0c;确定下载的apache版本&#xff0c;这里选择2.4…

定义一个类:实现功能可以返回随机的10个数字,随机的10个字母, 随机的10个字母和数字的组合;字母和数字的范围可以指定,类似(1~100)(A~z)...

#习题2&#xff1a;定义一个类&#xff1a;实现功能可以返回随机的10个数字&#xff0c;随机的10个字母&#xff0c; #随机的10个字母和数字的组合&#xff1b;字母和数字的范围可以指定class RandomString():#随机数选择的范围作为参数&#xff0c;如&#xff08;1~100&#x…

Navicat导入Excel表格数据

现在使用图像化工具来管理数据库是越来越方便了&#xff0c;PhpMyAdmin和Navicat都是管理数据库的好工具&#xff0c;这里我记录一下使用Navicat导入xls表格数据的方法。大家可以作为参考。 1、查看一下导入的表格&#xff0c;注意第一行是字段名&#xff08;也可以不要第一行…

creator2.0.2 native游戏截屏微信分享

cocos creator 2.0.2后 游戏内截屏&#xff0c;native微信SDK分享代码&#xff1a;public static wxShareScreenShot(sType: number) {let node new cc.Node();node.parent cc.director.getScene();node.width cc.view.getVisibleSize().width;node.x cc.view.getVisibleSi…

配置apache支持PHP(win7)

wamp和lamp是PHP工程师经常使用的环境&#xff0c;我们今天来配置apache&#xff0c;让它能够和php协同工作。 1、进入apache的conf目录&#xff0c;打开apache的配置文件httpd.conf。&#xff08;修改前建议先备份&#xff09; 修改apache软件所在目录&#xff1a; ServerRoo…

PHP5.6的安装与配置(win7)

1、PHP的安装 1&#xff09;、环境安装目录&#xff1a; D:/wamp/|——php|——php-5.6.22-Win32-VC11-x86|——Apache24|——mysql|——www2&#xff09;、下载 linux专用&#xff1a;http://www.php.net/downloads.php windows专用&#xff1a;http://windows.php.net/dow…

【一类题】二维数点的几个做法

二维数点的题目还用赘述么…… 题意就是这道题 离线 $CDQ$ 分治 在线 $k-d tree$转载于:https://www.cnblogs.com/scx2015noip-as-php/p/two-dimensional.html

MySQL5.7数据库软件下载教程

1、搜索MySQL 2、选择MySQL社区开源版本 3、单击下载社区版 4、选择所需版本-这里选择安装版 5、单击Download 6、建立Oracle账户/登录Oracle账户 注意&#xff1a;这里就不注册了&#xff0c;直接登录。 7、填写信息 8、单击下载MySQL数据库安装包 9…

.NET 面向对象基础

今天看大话设计模式&#xff0c;看到一些基础知识&#xff0c;记录下来。 对象&#xff1a;一切事务皆对象&#xff0c;对象是一个自包含的实体&#xff0c;用一组可识别的特性和行为来标识。好处&#xff0c;可维护、可扩展、可复用、灵活。 面向对象编程&#xff1a;其实就是…

后台传参与select-option标签的默认选中

从后台传递过来的参数是数据的详情页&#xff0c;在编辑页的select下拉框汇总既要显示所有的选项&#xff0c;又要默认显示选中项&#xff0c;后台传递过来的value值与option的value值相同时就默认选中&#xff08;即给option标签添加selected”selected”属性&#xff09;。 …

流操作运算符(二)

output管一个复数的输出&#xff0c;return之后再输出其它的复数 input同理 #include <iostream> using namespace std;class Complex {public:friend ostream & operator << (ostream &,Complex);friend istream & operator >> (istream &,…

jQuery教程08-属性筛选选择器

jQuery选择器之属性筛选选择器 属性选择器让你可以基于属性来定位一个元素。可以只指定该元素的某个属性&#xff0c;这样所有使用该属性而不管它的值&#xff0c;这个元素都将被定位&#xff0c;也可以更加明确并定位在这些属性上使用特定值的元素&#xff0c;这就是属性选择…

有关Canvas的一点小事—图像绘制

1、 使用canvas绘制图像 什么是图像&#xff1f;在js中它就是一个<img src””>&#xff0c;<img>有两种接收图像信息的方法&#xff0c;一个是直接链接到图像地址&#xff0c;一个使用base64数据&#xff0c;不过这里讨论的是canvas要使用的Image对象。我们有两个…

jQuery教程09-子元素筛选选择器

jQuery选择器之子元素筛选选择器 子元素筛选选择器不常使用&#xff0c;其筛选规则比起其它的选择器稍微要复杂点 子元素筛选选择器描述表&#xff1a; 注意&#xff1a; :first只匹配一个单独的元素&#xff0c;但是:first-child选择器可以匹配多个&#xff1a;即为每个父…

Python学习 - 之super函数

#super 真的是调用父类吗&#xff1f; class A:def __init__(self):print("A")class B(A):def __init__(self):super().__init__()print("B")class C(A):def __init__(self):print("C")super().__init__()class D(B,C):def __init__(self):print…

PHP-date(),time()函数的应用

1、求当前的时间戳&#xff08;单位&#xff1a;秒&#xff09; 说明&#xff1a;time() 函数返回自 Unix 纪元&#xff08;January 1 1970 00:00:00 GMT&#xff09;起的当前时间的秒数 语法&#xff1a;time() 举个栗子&#xff1a; //time():返回当前时间的 Unix 时间戳 e…

关于ppt中嵌入echarts图表

1.首先需要PPT2013版本以上带有开发工具&#xff0c;能够添加microsoft web browser控件 2.将echarts图表的html代码中加载 <meta http-equiv"X-UA-Compatible" content"IEEmulateIE*"/>代码&#xff08;*处至少为9或以上&#xff09;&#xff0c;将…

jQuery教程10-表单元素选择器

无论是提交还是传递数据&#xff0c;表单元素在动态交互页面的作用是非常重要的。jQuery中专门加入了表单选择器&#xff0c;从而能够极其方便地获取到某个类型的表单元素。 表单选择器的具体方法描述&#xff1a; 注意&#xff1a; 除了input筛选选择器&#xff0c;几乎每…