洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]
降雨量
题目背景
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。
输入输出样例
6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008
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,模拟]的更多相关文章
- 洛谷P2471——[SCOI2007]降雨量
本机AC提交RE…… 传送门:QAQQAQ 题意:自己看 思路:据说这道题用RMQ做很快,但这道题线段树是可以的 线段树维护一段区间最左年,最右年,是否有间隙和区间最大值 这道题分类讨论是一大难点,主 ...
- 洛谷 P5594 【XR-4】模拟赛
洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...
- 洛谷P3434 [POI2006]KRA-The Disks [模拟]
题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...
- 【题解】洛谷P3952 [NOIP2017TG] 时间复杂度(模拟)
题目来源:洛谷P3952 思路 纯模拟没啥可说的了 果然好复杂 参考了你谷一个40行代码 代码 #include<iostream> #include<cstdio> #inc ...
- 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判
[BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...
- BZOJ1067 [SCOI2007]降雨量 RMQ???
求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
- 洛谷P1086 花生采摘【模拟】
题目描述 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!――熊字”. 鲁宾逊先生和多多都很开心,因为花生正是他 ...
- P2471 [SCOI2007]降雨量
Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2 ...
随机推荐
- ios 虚拟机中文件下载路径
每个人mac上的路径会有不同,你可以打印出你文件下载存放的路径,然后拷贝一下,再单击桌面空白处,最上面的导航栏上有个“前往”,然后找到“前往文件夹”,粘贴一下,就可以找到了.
- 2017 济南精英班 Day1
不管怎么掰都是n*m-1 #include<cstdio> using namespace std; int main() { freopen("bpmp.in",&q ...
- 树形dp的进阶 (一)
①树的重心的性质的运用 ②缩点以后寻找规律 树的直径! ③树形dp上的公式转换 ④和期望有关的树形dp + 一点排列组合的知识 ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 一:Codeforces Round #364 ...
- CF745 C 并查集
并查集由于政府不能连通我们可以先按给出的边建立连通块,再将不含有政府的点全部作为一个连通块,边数为(n-1)*n/2然后 贪心地将该连通块与[含政府的.且包含点数最多的]连通块相连,然后由于新增了一些 ...
- ZOJ 3774 二次剩余
LINK 题意:简单粗暴,求菲波那契数列每个数的m次的前n项和模1e9+7 思路:斐波那契通项式, 注意到有很多根号5,求二次剩余为5模1e9+7的解,显然我们可以直接找一个(383008016),然 ...
- HDU 2157 How many ways?? 临接矩阵+快速幂
Problem Description 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, ...
- 给APP增加RSA签名
RSA签名,Google主要用于APP的来源控制与结算.所谓的结算,也是就是控制了APP只有使用现在机子上登录的Google账户从Google市场曾经下载过该APP的才能够使用,这样也就达到了app销 ...
- MongoDB 分页
使用Skip和limit可以如下做数据分页: Code: page1 = db.things.find().limit(20) page2 = db.things.find().skip(20).li ...
- 【CodeForces】913 D. Too Easy Problems
[题目]D. Too Easy Problems [题意]给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数 ...
- 浅析 Spring Aop
aop也是Spring里比较重要的一个点,最近把源码看了下,这里总结一下 使用上主要就下面的点注意下: 相关的Annotaion Around Before After AfterReturning ...