题目传送门

降雨量

题目背景

07四川省选

题目描述

我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。

输入输出格式

输入格式:

输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

输出格式:

对于每一个询问,输出true,false或者maybe。

输入输出样例

输入样例#1:

6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008
输出样例#1:

false
true
false
maybe
false

说明

100%的数据满足:1<=n<=50000, 1<=m<=10000, $-10^9\leq yi\leq 10^9$,$1\leq ri\leq 10^9$


  分析:

  一道细节贼多的$RMQ$问题。

  因为年份太多,所以不能直接用年份作下标,需要离散化。每次询问给定左端点和右端点后,找出第一个不小于它们的年份,也就确定了下标,令它们为$sta,ed$。那么在区间$(sta,ed)$中找到最大的降雨量,与边界进行判断得到结果。当然,如果左端点并没有在输入的年份中,就应该要在区间$[sta,ed)$中找最大的降雨量判断。判断的情况如下:

  $false$:

  右端点与左端点都已经在输入中给出且右端点的降雨量大于左端点降雨量;

  右端点的年份已经在输入中给出且在区间中找到的最大值大于等于右端点降雨量;

  左端点的年份已经在输入中给出且在区间中找到的最大值大于等于左端点降雨量;

  $maybe$:

  左端点或右端点没有在输入数据中给出;

  左右端点的下标之差小于左右端点的年份之差;

  $true$:

  除了以上情况。

  只要注意好所有的细节,考虑到所有的情况,这题也就不难想了。

  Code:

  

//It is made by HolseLee on 4th Sep 2018
//Luogu.org P2471
#include<bits/stdc++.h>
using namespace std; const int N=5e4+;
int n,m,ye[N],ra[N]; namespace Segment {
int seg[N<<]; inline void pushup(int rt)
{
seg[rt]=max(seg[rt<<],seg[rt<<|]);
} void build(int l,int r,int rt)
{
if( l>r )return;
if( l==r ) {
seg[rt]=ra[l]; return;
}
int mid=(l+r)>>;
build(l,mid,rt<<); build(mid+,r,rt<<|);
pushup(rt);
} int quary(int l,int r,int rt,int L,int R)
{
int ret=;
if( l>R || r<L ) return ret;
if( L<=l && r<=R ) return seg[rt];
int mid=(l+r)>>;
if( L<=mid ) ret=max(ret,quary(l,mid,rt<<,L,R));
if( R>mid ) ret=max(ret,quary(mid+,r,rt<<|,L,R));
return ret;
}
} inline int read()
{
char ch=getchar(); int num=; bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true;
ch=getchar();
}
while( ch>='' && ch<='' ) {
num=(num<<)+(num<<)+(ch^);
ch=getchar();
}
return flag ? -num : num;
} int main()
{
n=read();
for(int i=; i<=n; ++i) {
ye[i]=read(), ra[i]=read();
}
Segment::build(,n,);
m=read();
int x,y,sta,ed,ka; bool fl,fr;
for(int i=; i<=m; ++i) {
x=read(); y=read();
if( x>=y ) {
printf("false\n"); continue;
}
sta=lower_bound(ye+,ye+n+,x)-ye;
ed=lower_bound(ye+,ye+n+,y)-ye;
fl=ye[sta]==x, fr=ye[ed]==y; ka=;
if( !fl ) sta--;
if( sta+<=ed-) ka=Segment::quary(,n,,sta+,ed-);
if( (ka>=ra[sta] && fl) || (ka>=ra[ed] && fr) || (ra[ed]>ra[sta] && fl && fr) ) printf("false\n");
else if( ed-sta!=ye[ed]-ye[sta] || !fl || !fr ) printf("maybe\n");
else printf("true\n");
}
}

洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]的更多相关文章

  1. 洛谷P2471——[SCOI2007]降雨量

    本机AC提交RE…… 传送门:QAQQAQ 题意:自己看 思路:据说这道题用RMQ做很快,但这道题线段树是可以的 线段树维护一段区间最左年,最右年,是否有间隙和区间最大值 这道题分类讨论是一大难点,主 ...

  2. 洛谷 P5594 【XR-4】模拟赛

    洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...

  3. 洛谷P3434 [POI2006]KRA-The Disks [模拟]

    题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...

  4. 【题解】洛谷P3952 [NOIP2017TG] 时间复杂度(模拟)

    题目来源:洛谷P3952 思路 纯模拟没啥可说的了 果然好复杂 参考了你谷一个40行代码 代码 #include<iostream> #include<cstdio> #inc ...

  5. 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判

    [BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...

  6. BZOJ1067 [SCOI2007]降雨量 RMQ???

    求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...

  7. 洛谷P1039 侦探推理(模拟)

    侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...

  8. 洛谷P1086 花生采摘【模拟】

    题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他 ...

  9. P2471 [SCOI2007]降雨量

    Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2 ...

随机推荐

  1. (转)C++常见问题: 字符串分割函数 split

    http://www.cnblogs.com/dfcao/p/cpp-FAQ-split.html C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速 ...

  2. javascript 实现 A-star 寻路算法

    在游戏开发中,又一个很常见的需求,就是让一角色从A点走到B点,而我们期望所走的路是最短的,最容易想到的就是两点之间直线最短,我们可以通过勾股定理来求出两点之间的距离,但这个情况只能用于两点之间没有障碍 ...

  3. PHP字符串定义方式和单引号双引号的区别

    $str=<<<任意标记 ......................... .............................. 任何标记; 单引号和双引号的区别? ''号 ...

  4. 2.aop中几个注解的含义

    参考地址:http://elim.iteye.com/blog/2395255

  5. CF540 C BFS 水

    '.'->'X' 前者走后变成后者,后者除了是终点不能再走.初始位置是X很傻的以为这样从初始点走出去后初始位置就变成不能走了,实际上是还能走一次的. 其他就是BFS,路上记得把路变成X就好了 太 ...

  6. 无废话JavaScript(下)

    五.函数式 这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯泡还在照耀着我们. 其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实 ...

  7. 【CodeForces】679 B. Bear and Tower of Cubes

    [题目]B. Bear and Tower of Cubes [题意]有若干积木体积为1^3,2^3,...k^3,对于一个总体积X要求每次贪心地取<=X的最大积木拼上去(每个只能取一次)最后总 ...

  8. 网易android开发面试题及心得

    前几天面试网易android开发,总体感觉问题难度一般.怪我自己没有好好梳理知识,尤其是基础,后面就没消息了... 笔试: 1.描述Activity 生命周期 2.什么是ANR,如何规避? 3.描述a ...

  9. ECNA 2017

    ECNA 2017 Abstract Art 题目描述:求\(n\)个多边形的面积并. solution 据说有模板. Craters 题目描述:给定\(n\)个圆,求凸包的周长. solution ...

  10. tftp 开发板ping不通PC机

    开发板:JZ2440(天下2440开发板是一家) 当进入uboot界面时:输入命令print则显示: 将PC端的IP设置为192.168.1.11 在开发板上ping   192.168.1.11,若 ...