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. windows puppet manifests 文件维护

    初级 puppet windows agent实现简单的msi格式安装包安装及bat文件创建;

  2. Python获取并输出当前日期时间

    取得时间相关的信息的话,要用到python time模块,python time模块里面有很多非常好用的功能,你可以去官方文档了解下,要取的当前时间的话,要取得当前时间的时间戳,时间戳好像是1970年 ...

  3. 在Windows 下为PHP5.4安装PEAR, PHPUnit , phpDoc2

    1.安装PEAR   官方网站: http://pear.php.net/   PHP 5.4 的 Windows 包中没有自带 PEAR,下载 http://pear.php.net/go-pear ...

  4. [Angular 2] Event in deep

    This lesson talks about the benefits of using the parens-based (click) syntax so that Angular 2 can ...

  5. 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...

  6. QT实现透明效果的按钮

    QPushButton { color: rgb(0,88,152) background-color: rgba(97%,80%,9%,50%)}

  7. DEV GridControl 获取选中行的数据

    private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowCha ...

  8. HTML页面之间跳转与传值(JS代码)

    跳转的方法如下: 方法一: window.location.href = "b.html"; 方法二(返回上一个页面,这个应该不算,先放在这): window.history.ba ...

  9. 除去内容中的HTML代码方法

    显示内容时,需要截取部分,而不要全部显示.在截取时,会出现这样的情况: 截取一定量的字符串后,可能会把未关闭的表格HTML代码留下来,最終导致界面受影响, 下面的是C#解决办法: public str ...

  10. ControlStyles(枚举)

    指定控件的样式和行为. 此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合.属性: ContainerControl:如果为true,则控件是类似容器的控件. UserP ...