降雨量

BZOJ 1067: [SCOI2007]降雨量(线段树/RMQ)

帅比萌擦擦* 提交于 2019-12-31 17:57:58
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890, 则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未 知,有的说法是可能正确也可以不正确的。 Input 输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小 到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是 自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。 Output 对于每一个询问,输出true,false或者maybe。 题解: 题目已经说的很清楚要求区间最值了…就是判断条件时太恶心了… 解释写在代码里了 AC代码(线段树): # pragma GCC optimize(2) # include <bits/stdc++.h> # include <ext/rope> using namespace std ; using namespace __gnu_cxx ; # define pii pair<int,int> #

【Luogu P2471】[SCOI2007]降雨量

痞子三分冷 提交于 2019-12-05 19:42:29
Luogu P2471 啊啊啊啊这真是一道史上最毒瘤的题目!!!!! 题意就是给出n个年份的降雨量 询问:“自从 \(y\) 年以来 \(x\) 年的降雨量最大”的正确性。 显然有多种情况需要考虑,那么就需要通过分类讨论理清程序的逻辑了。 对于“自从 \(y\) 年以来 \(x\) 年的降雨量最大”这样一句话,可以转化成如下条件: \(rain[x]<=rain[y]且\forall a \in [y+1,x-1]有rain[a]<rain[x]\) 经过这样的转化,我们就可以对各种情况进行分类讨论了。 定义: \(query(x,y)\) 等于 \(rain[x...y]\) 的最大值 \[ ①rain[y]未知,rain[x]已知的情况:若此时query(y+1,x-1)>=rain[x]则导出false,反之则导出maybe\\ ②rain[x]未知,rain[y]已知:若此时query(y+1,x-1)>=rain[y]则导出false,反之则导出maybe\\ ③rain[x]、rain[y]均未知:则导出maybe\\ ④两者皆已知:rain[x]>rain[y]导出false;query(y+1,x-1)>=rain[x]导出false\\ 若以上两个条件均不符合,则不可能再导出false\\ 此时再判断:若\exists a \in [y+1,x-1] 有rain