What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flower” kindergarten are prepared to have an excursion. Before kicking off, teacher Liu tells them to stand in a row. Teacher Liu has an important message to announce, but she doesn’t want to tell them directly. She just wants the message to spread among the kids by one telling another. As you know, kids may not retell the message exactly the same as what they was told, so teacher Liu wants to see how many versions of message will come out at last. With the result, she can evaluate the communication skills of those kids. Because all kids have different height, Teacher Liu set some message passing rules as below:
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.
 
Input
The first line contains an integer T indicating the number of test cases, and then T test cases follows. Each test case consists of two lines. The first line is an integer N (0< N <= 50000) which represents the number of kids. The second line lists the height of all kids, in left to right order. It is guaranteed that every kid’s height is unique and less than 2^31 – 1 .
 
Output
For each test case, print “Case t:” at first ( t is the case No. starting from 1 ). Then print N lines. The ith line contains two integers which indicate the position of the ith (i starts form 1 ) kid’s “left messenger” and “right messenger”. If a kid has no “left messenger” or “right messenger”, print ‘0’ instead. (The position of the leftmost kid is 1, and the position of the rightmost kid is N)
 
Sample Input
2
5
5 2 4 3 1
5
2 1 4 3 5
 
Sample Output
Case 1:
0 3
0 0
2 4
0 5
0 0
Case 2:
0 2
0 0
1 4
0 0
3 0
 
题意:简单点说就是找到每个数他左边比它小的最大的数以及右边比它小的最大的数,但是有限制条件,以左边为例,只能在左边第一个比它大的数(如果有的话)和它之间
的范围里找,右边同理。
 
解析:有单调栈的解法,我这里说一下RMQ如何做,我在数组最左边和最右边添加一个很大的数(确保任何一个数都可以确定范围),然后以某个位置i为例,我用RMQ查找0到
i-1之间第一个比它大的数(二分+RMQ),找到位置j,再用RMQ直接找j+1到i-1之间最大值(如果j+1==i,则没有)。
 
代码
#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,感觉我写的有点多此一举。。。其实可以用单调栈)的更多相关文章

  1. hdu 3410 Passing the Message(单调队列)

    题目链接:hdu 3410 Passing the Message 题意: 说那么多,其实就是对于每个a[i],让你找他的从左边(右边)开始找a[j]<a[i]并且a[j]=max(a[j])( ...

  2. Oracle,Sql,procedure 感觉自己写的很棒的一个存储过程

    感觉自己写的很棒的一个Oracle存储过程,(其实想说很叼^,^). 集成了一堆操作数据的功能(至少几十), 包括存储过程执行异常信息输出帮助诊断. 亮点很多, 比如`over(partition b ...

  3. Passing the Message 单调栈两次

    What a sunny day! Let’s go picnic and have barbecue! Today, all kids in “Sun Flower” kindergarten ar ...

  4. Passing the Message

    Passing the Message http://acm.hdu.edu.cn/showproblem.php?pid=3410 Time Limit: 2000/1000 MS (Java/Ot ...

  5. 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 ...

  6. this.$Message.success('提示信息') 少写了一个c 导致报错

    this.$Message.success('提示信息') 少写了一个c 导致报错 而且 $Message 输出还没显示,导致我以为是没有 $Message 对象了,其实全局对象直接调用即可

  7. BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)

    BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...

  8. 大视野 1012: [JSOI2008]最大数maxnumber(线段树/ 树状数组/ 单调队列/ 单调栈/ rmq)

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 9851  Solved: 4318[Submi ...

  9. UVALive 6531 Go up the ultras 单调栈+RMQ

    题目链接:点击打开链接 题意: 给定n座山 以下n个数字表示n座山的高度 若这座山u合法,则要满足: 1.若u的左边存在比u高的山,设v是u左边距离u近期的且严格比u高的山,在[v,u]之间至少有一座 ...

随机推荐

  1. USB枚举详细过程剖析(转)

    USB枚举详细过程剖析(转) 原文地址:http://blog.163.com/luge_arm/blog/static/6774972620071018117290/ 从驱动开发网看到一篇<U ...

  2. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

  3. 开源 免费 java CMS - FreeCMS1.5-系统配置

    下载地址:http://code.google.com/p/freecms/ 系统配置 从FreeCMS 1.2 开始支持 管理系统使用的配置项. 从左侧管理菜单点击系统配置进入. 从FreeCMS ...

  4. Linux查看网络即时网速

    sar -n DEV 1 100 1代表一秒统计并显示一次 100代表统计一百次 使用ntop等工具,就更方便简单了,不过这个更灵活 P.S. sar在sysstat包 来源:http://www.c ...

  5. python - 消息队列

    消息队列分类 1.先进先出 2.后进先出 3.优先级队列 4.双向队列 1.先进先出 import queue q = queue.Queue(2) #队列最大长度 q.put(11) q.put(2 ...

  6. SQL Server Profile:使用方法和指标说明

    SQL Server Profiler的中文意思是SQL Server事件探查,一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接.感觉这个工具的作用还是很大的,给大家分享一 ...

  7. oracle 自动添加序号列 排序

    select      HSL.sortno,                    HSL.B,                    HSL.A,                    row_n ...

  8. Unable to open log device '/dev/log/main': No such file or directory

    在我们使用真机进行Android应用调试时,无法获得调试信息,错误提示如下:Unable to open log device '/dev/log/main': No such file or dir ...

  9. NSArray使用小结

    http://blog.csdn.net/ms2146/article/details/8654263

  10. Oracle11.2.0.4 RAC安装文档

    1 环境配置 参考官方文档<Grid Infrastructure Installation Guide for Linux> 1.1 软件环境 操作系统: [root@howe1 ~]# ...