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]之间至少有一座 ...
随机推荐
- c语言指针点滴1
#include <stdio.h> #include <stdlib.h> void main() { int *p = NULL;//指针开始最好都初始化为空 if(p = ...
- hdu 5410 CRB and His Birthday(混合背包)
Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...
- windows 查看端口被占用
C:\Users\xxxx> 根据端口找到进程14716 C:\Users\xxxx>tasklist|findstr "14716"node.exe 14716 Co ...
- php 实现购物车
<?php class Cart{ public function Cart() { if(!isset($_SESSION['cart'])){ ...
- 初识前端HTML
HTML 超文本标记语言 HTML的解析 顾名思义,HTML就是由一个个的标签组成的,组成后,HTML可被浏览器直接识别以及处理成我们想给用户展示的样子. 下面我们就来解析HTML的一个个标签. &l ...
- pyqt时间
# -*- coding: utf-8 -*-__author__ = 'Administrator'from PyQt4 import QtCore, QtGui class Help(QtGui. ...
- webService返回自定义类型的数据处理
1.自定义一个Student 数据类型: package com.chnic.webservice; import java.io.Serializable; public class Student ...
- Android无法导入下载好的项目(和Eclipse中已经存在的项目命名一样导致冲突)解决办法
错误提示: 在我们到导入从网络下载的项目时,经常会出现如下问题(选择的项目变灰,并且提示要选择至少一个项目): 错误原因: 出现这样的错误主要是因为你的Eclipse已经存在了和上图中New Proj ...
- DotNet程序汉化过程--SnippetCompiler简单解说
SnippetCompiler介绍 平时要验证一段C#代码或者写一个算法,就得打开庞大的VS新建一个解决方案,占用了硬盘空间不说还费时费力.SnippetCompiler这个工具就可以在这里帮到我们了 ...
- easyui treeJson 带层数
public string GetTreeNav(int ID,int Num) { StringBuilder sb = new StringBuilder(); sb.Append("[ ...