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. 找出最小的k个数

    •已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中 ...

  2. java_接口的应用

    package com.test; interface USB{ //创建一个USB接口,所有的操作要按照这个标准来工作 void start();//默认为public void stop(); } ...

  3. 【InversionCount 逆序对数 + MergeSort】

    Definition of Inversion: Let (A[0], A[1] ... A[n], n <= 50) be a sequence of n numbers. If i < ...

  4. 线程异常:undefined reference to &#39;pthread_create&#39; 处理

    源代码: #include <stdio.h> #include <pthread.h> #include <sched.h> void *producter_f ...

  5. BUG出现的地方真的令我这个测试新人想象不到

    今天上班,仍然在等待下一阶段项目的研发完成. 没有正式测试任务的我,作为新手肯定要趁着这个时间好好学习了,偶尔再拿出公司已经上线发布的APP来到处看看. 就在这偶尔的情况下让我发现了一个在正式测试时根 ...

  6. Android开发所有视频教程汇总

    1.Mars的Android开发视频教程作者讲解的很详细,很全面,系统.以前出了两套视频,分别是<Java4Android视频教程>.<Android视频教程>,以及最新刚新出 ...

  7. SpringTest2

    Spring 框架第二天 AOP切面编程 今天重点内容: 1. 什么是AOP ? AOP实现原理是怎样的? AOP相关术语 2. AOP底层实现 (了解) ----- JDK动态代理. Cglib动态 ...

  8. Linux设置日期

    $ date -s "2016-07-13 14:54" 把时间设置为2016-07-13 14:54

  9. C#holle world

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. javaWeb RSA加密使用

      加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下. 先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但 ...