58. 延绵的山峰

58. 延绵的山峰

★★☆   输入文件:climb.in   输出文件:climb.out   简单对比
时间限制:1 s   内存限制:512 MB

问题描述

有一座延绵不断、跌宕起伏的山,最低处海拔为0,最高处海拔不超过8848米,从这座山的一端走到另一端的过程中,每走1米海拔就升高或降低1米。有Q个登山队计划在这座山的不同区段登山,当他们攀到各自区段的最高峰时,就会插上队旗。请你写一个程序找出他们插旗的高度。

输入文件

第1行,一个整数N(N<=10^6),表示山两端的跨度。

接下来N+1行,每行一个非负整数Hi,表示该位置的海拔高度,其中H0=Hn=0。

然后是一个正整数Q(Q<=7000),表示登山队的数量。

接下来Q行,每行两个数Ai, Bi,表示第i个登山队攀爬的区段[Ai,Bi],其中0<=Ai<=Bi<=N。

输出文件

Q行,每行为一个整数,表示第i个登山队插旗的高度。

样例输入

10

0

1

2

3

2

3

4

3

2

1

0

5

0 10

2 4

3 7

7 9

8 8

样例输出

4

3

4

3

2

[1,n]

//RMQ裸题
#include<cstdio>
#include<iostream>
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
const int N=1e6+5;
int n,m,p[21],l[N],f[N][21];
void pre_deal(){
    for(int i=0;i<=20;i++){
        p[i]=1<<i;
        if(p[i]<=n) l[p[i]]=i;
    }
    for(int i=2,near;i<=n;i++){
        if(l[i]) near=l[i];
        else l[i]=near;
    }
}
void RMQ(){
    for(int j=1;j<=20;j++){
        for(int i=1;i+p[j]-1<=n;i++){
            f[i][j]=max(f[i][j-1],f[i+p[j-1]][j-1]);
        }
    }
}
int query(int i,int j){
    int k=l[j-i+1];
    return max(f[i][k],f[j-p[k]+1][k]);
}
int main(){
    freopen("climb.in","r",stdin);
    freopen("climb.out","w",stdout);
    n=read();
    for(int i=0;i<=n;i++) f[i][0]=read();
    pre_deal();
    RMQ();
    m=read();
    for(int i=1,x,y;i<=m;i++){
        x=read();y=read();
        if(!x&&!y){puts("0");continue;}
        if(!x) ++x;
        printf("%d\n",query(x,y));
    }
    return 0;
}

[0,n]

//RMQ裸题
#include<cstdio>
#include<iostream>
using namespace std;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
const int N=1e6+5;
int n,m,p[21],l[N],f[N][21];
void pre_deal(){
    for(int i=0;i<=20;i++){
        p[i]=1<<i;
        if(p[i]<=n) l[p[i]]=i;
    }
    for(int i=2,near;i<=n+1;i++){//1W:10-0+1==11,so n+1
        if(l[i]) near=l[i];
        else l[i]=near;
    }
}
void RMQ(){
    for(int j=1;j<=20;j++){
        for(int i=0;i+p[j]-1<=n;i++){
            f[i][j]=max(f[i][j-1],f[i+p[j-1]][j-1]);
        }
    }
}
int query(int i,int j){
    int k=l[j-i+1];
    return max(f[i][k],f[j-p[k]+1][k]);
}
int main(){
    freopen("climb.in","r",stdin);
    freopen("climb.out","w",stdout);
    n=read();
    for(int i=0;i<=n;i++) f[i][0]=read();
    pre_deal();
    RMQ();
    m=read();
    for(int i=1,x,y;i<=m;i++){
        x=read();y=read();
        printf("%d\n",query(x,y));
    }
    return 0;
}
时间: 2024-10-02 21:06:19

58. 延绵的山峰的相关文章

【cogs58】延绵的山峰【st表】

问题描述 有一座延绵不断.跌宕起伏的山,最低处海拔为0,最高处海拔不超过8848米,从这座山的一端走到另一端的过程中,每走1米海拔就升高或降低1米.有Q个登山队计划在这座山的不同区段登山,当他们攀到各自区段的最高峰时,就会插上队旗.请你写一个程序找出他们插旗的高度. 输入文件 第1行,一个整数N(N<=10^6),表示山两端的跨度. 接下来N+1行,每行一个非负整数Hi,表示该位置的海拔高度,其中H0=Hn=0. 然后是一个正整数Q(Q<=7000),表示登山队的数量. 接下来Q行,每行两个数

套装小姐——升华之路

入夏的北京骄阳似火,年中的工作冲刺更是使自己身心俱疲.幸运的是,冲刺之后得来的是一个不长不短的小假期.收拾好心情以及行李,我踏上了开往山西的火车. 山西因居太行以西而得名,简称晋,有华夏文明摇篮的美称.说到山西,人们往往想起乔家大院.壶口瀑布.云冈石窟这些标志性当地旅游景区,而我要去的却并不是这些地方,我要去的是佛教圣地--五台山. 五台山素有中国佛教四大名山之首的美称,奇峰灵崖.寺院古刹都让我对他向往不已.初到五台山的我并没有选择山脚下的避暑山庄,而是选择了住在寺庙里.厢房并没有想象中的那么简

【文学】飞狐峪

到飞狐峪只是偶然的机会.路过蔚县时有本地人推荐,时间也合适,就顺便去了一趟,没想到飞狐峪却惊艳到了我. 飞狐峪是一条幽长的峡谷,山峰怪异.谷幽奇绝.大体呈南北走向,神幻复杂,逶迤蜿蜒,最宽处达百米,最窄处不过十几米.时而陡壁挡面,有“山穷水尽疑无路”之虑:时而豁然开朗,有“柳暗花明又一村”之奇. 在当地流传有:“四十里飞狐七十二道弯,弯弯有洞天,处处含胜景”的说法.穿飞狐峪,由北向南分别有“一柱香”.“双箭孔”.“三仙思凡”.“四将守门”.“五狗望月”.“六郎柱”.“七女峰”.“八仙洞”等景观.

【bfs】BZOJ1102- [POI2007]山峰和山谷Grz

最后刷个水,睡觉去.Bless All! [题目大意] 给定一个地图,为FGD想要旅行的区域,地图被分为n*n的网格,每个格子(i,j) 的高度w(i,j)是给定的.若两个格子有公共顶点,那么他们就是相邻的格子.(所以与(i,j)相邻的格子有(i?1, j?1),(i?1,j),(i?1,j+1),(i,j?1),(i,j+1),(i+1,j?1),(i+1,j),(i+1,j+1)).我们定义一个格子的集合S为山峰(山谷)当且仅当:1.S的所有格子都有相同的高度.2.S的所有格子都联通3.对于

58同城2015校招笔试、一面、二面经历

10.18 宣讲 58宣讲时间真是安排的晚...19.30开始,我6.30就到了..整整放了1个小时不重复的视频.....我听完他们CSO对行业和公司的介绍就走了.感觉58可能是o2o的下一个爆发点.感觉蛮有前景的.宣讲会也是和小米的宣讲差不多,过道上都挤满了人这种.我个人还是比较些向往去58的.个人感觉对于O2O,58算是赶了个早集..把最脏最累的活给做了..反而是美团,大众点评这种抓住了热点...当然,未来的大趋势也是O2O,就看58能不能赶上这趟快车了. 10.19 笔试 昨天的唯品会和中

CODEVS-1531 山峰

题目描述 Description Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, --, n.每个山峰的高度都是不一样的.编号为i的山峰高度为hi. 小修从西往东登山.每到一座山峰,她就回头观望自己走过的艰辛历程.在第i座山峰,她记录下自己回头能看到的山峰数si. 何谓"能看到"?如果在第i座山峰,存在j<k<i,hj<hk,那么第j座山峰就是不可见的.除了不可见的山峰,其余的山峰都是可见的. 回家之后,小修把所有的si加起来得到S作为她此次旅

leetCode 58. Length of Last Word 字符串

58. Length of Last Word Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string. If the last word does not exist, return 0. Note: A word is defined as a character sequence c

CentOS 6.x 内核升级(2.6.32 -&gt; 3.10.58)过程记录

1. 准备工作 确认内核及版本信息 [[email protected] ~]# uname -r2.6.32-220.el6.x86_64 [[email protected] ~]# cat /etc/centos-release CentOS release 6.2 (Final) 安装软件 编译安装新内核,依赖于开发环境和开发库 # yum grouplist  //查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库: # yum groupinstall "D

python3.4+selenium爬58同城(一)

爬取http://bj.58.com/pbdn/0/pn2/中除转转.推广商品以外的产品信息,因为转转和推广的详情信息不规范,需要另外写一个方法存放,后期补上,详情页如下 这周学习了爬虫,但是遇到一些js,requests方法无法渲染,比如浏览量,所以结合selenium+phantomjs渲染网页,获取信息 上代码,注释中详细解释: from selenium import webdriverfrom bs4 import BeautifulSoupimport re class GetPag