hdu3410-Passing the Message(RMQ,感觉我写的有点多此一举。。。其实可以用单调栈)
1.She tells the message to the tallest kid.
2.Every kid who gets the message must retell the message to his “left messenger” and “right messenger”.
3.A kid’s “left messenger” is the kid’s tallest “left follower”.
4.A kid’s “left follower” is another kid who is on his left, shorter than him, and can be seen by him. Of course, a kid may have more than one “left follower”.
5.When a kid looks left, he can only see as far as the nearest kid who is taller than him.
The definition of “right messenger” is similar to the definition of “left messenger” except all words “left” should be replaced by words “right”.
For example, suppose the height of all kids in the row is 4, 1, 6, 3, 5, 2 (in left to right order). In this situation , teacher Liu tells the message to the 3rd kid, then the 3rd kid passes the message to the 1st kid who is his “left messenger” and the 5th kid who is his “right messenger”, and then the 1st kid tells the 2nd kid as well as the 5th kid tells the 4th kid and the 6th kid. Your task is just to figure out the message passing route.
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<sstream>
#include<algorithm>
#include<utility>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<iterator>
#include<stack>
using namespace std;
const int INF=1e9+;
const double eps=1e-;
const int maxn=;
int N,A[maxn],B[maxn];
int Lg[maxn],ansl[maxn],ansr[maxn];
void GetLg()
{
Lg[]=-;
for(int i=;i<maxn;i++) Lg[i]=Lg[i-]+((i&(i-))?:);
}
typedef pair<int,int> par;
par rmq[][maxn][];
int f(int x){ return <<x; }
void ST() //保存最大值,同时把值和下标保存下来
{
for(int i=;i<=N+;i++) rmq[][i][]=make_pair(A[i],i); //下标为正是为了方便找左边第一个比某个数大的位置
for(int i=;i<=N+;i++) rmq[][i][]=make_pair(A[i],-i); //下标为负是为了方便找右边第一个比某个数大的位置
for(int k=;k<;k++)
for(int j=;f(j)<=N+;j++)
for(int i=;i+f(j)-<=N+;i++)
rmq[k][i][j]=max(rmq[k][i][j-],rmq[k][i+f(j-)][j-]);
}
par RMQ(int x,int y,int type)
{
if(x>y) swap(x,y);
int k=Lg[y-x+];
return max(rmq[type][x][k],rmq[type][y-f(k)+][k]);
}
int GetPos(int x,int y,int type,int v)
{
while(true)
{
if(x==y) return x;
int mid=(x+y)/;
par a=RMQ(x,mid,type);
par b=RMQ(mid+,y,type);
if(type==)
{
if(b.first>v) x=mid+;
else y=mid;
}
if(type==)
{
if(a.first>v) y=mid;
else x=mid+;
}
}
}
int main()
{
GetLg();
int T,Case=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
A[]=A[N+]=INF;
for(int i=;i<=N;i++)
{
scanf("%d",&A[i]);
B[i]=A[i];
}
sort(B+,B+N+);
for(int i=;i<=N;i++) A[i]=lower_bound(B+,B+N+,A[i])-B;//离散化
ST();
for(int i=;i<=N;i++)
{
int pos=GetPos(,i-,,A[i]); //找到左边第一个比他大的数的位置
if(pos+==i) ansl[i]=; //中间没有比他小的数
else ansl[i]=RMQ(pos+,i-,).second;
}
for(int i=N;i>=;i--)
{
int pos=GetPos(i+,N+,,A[i]);
if(pos-==i) ansr[i]=;
else ansr[i]=-RMQ(i+,pos-,).second;
}
printf("Case %d:\n",++Case);
for(int i=;i<=N;i++) printf("%d %d\n",ansl[i],ansr[i]);
}
return ;
}
hdu3410-Passing the Message(RMQ,感觉我写的有点多此一举。。。其实可以用单调栈)的更多相关文章
- hdu 3410 Passing the Message(单调队列)
题目链接:hdu 3410 Passing the Message 题意: 说那么多,其实就是对于每个a[i],让你找他的从左边(右边)开始找a[j]<a[i]并且a[j]=max(a[j])( ...
- Oracle,Sql,procedure 感觉自己写的很棒的一个存储过程
感觉自己写的很棒的一个Oracle存储过程,(其实想说很叼^,^). 集成了一堆操作数据的功能(至少几十), 包括存储过程执行异常信息输出帮助诊断. 亮点很多, 比如`over(partition b ...
- Passing the Message 单调栈两次
What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flower” kindergarten ar ...
- Passing the Message
Passing the Message http://acm.hdu.edu.cn/showproblem.php?pid=3410 Time Limit: 2000/1000 MS (Java/Ot ...
- HDU - 3410 Passing the Message 单调递减栈
Passing the Message What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flo ...
- this.$Message.success('提示信息') 少写了一个c 导致报错
this.$Message.success('提示信息') 少写了一个c 导致报错 而且 $Message 输出还没显示,导致我以为是没有 $Message 对象了,其实全局对象直接调用即可
- BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...
- 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 9851 Solved: 4318[Submi ...
- UVALive 6531 Go up the ultras 单调栈+RMQ
题目链接:点击打开链接 题意: 给定n座山 以下n个数字表示n座山的高度 若这座山u合法,则要满足: 1.若u的左边存在比u高的山,设v是u左边距离u近期的且严格比u高的山,在[v,u]之间至少有一座 ...
随机推荐
- Paint House II 解答
Question There are a row of n houses, each house can be painted with one of the k colors. The cost o ...
- 打开首页老是加载themes.googleusercontent.com_Wopus问答
打开首页老是加载themes.googleusercontent.com_Wopus问答 打开首页老是加载themes.googleusercontent.com
- oracle数据库 ORA-12560: 协议适配器错误
ORA-12560: 协议适配器错误 造成ORA-12560: TNS: 协议适配器错误的问题的原因有三个: 1.监听服务没有起起来.windows平台个一如下操作:开始---程序---管理工具-- ...
- java bootstrap分页
样式如下 datumMap.total总共多少页 datumMap.page第几页 <nav class="pull-right"> <ul class=&quo ...
- javascript实现的有缩略图功能的幻灯片切换效果
不久前写了一个简单的图片效果,没想到那么快就要用到项目中,所以功能方面要丰富一下: 主要改进: 1# 用圆点代替之前简单的页数显示,并且点击圆点可以显示对应图片: 2# 点击圆点,显示对应图片的缩略图 ...
- Excel函数大全
我们在使用Excel制作表格整理数据的时候,经常要用到它的函数功能来自己主动统计处理表格中的数据.这里整理了Excel中使用频率最高的函数的功能.用法,以及这些函数在实际应用中的实例剖析,并配有具体的 ...
- CUGBACM_Summer_Tranning 组队赛解题报告
组队赛解题报告: CUGBACM_Summer_Tranning 6:组队赛第六场 CUGBACM_Summer_Tranning 5:组队赛第五场 CUGBACM_Summer_Tranning 4 ...
- Homebrew新一代OS X套件管理工具 高速安装Git
在Mac上安装一些开源程序,除了自己下下载.编译( ./configure && make && make install) 之外,通常最方便的选择就是用套件管理工具來 ...
- 查看linux版本和内核信息
一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [root@localhost ~]# cat /proc/versionLinux version 2.6.32 ...
- java.sql.SQLException: ORA-00911: 无效字符 解决方案
在使用java执行sql时,抛出的这样一个Oracle异常,最后发现是sql语句末尾有一个分号导致,例如:sql="select * from tl_demo;" .删除" ...