点此看题面

大致题意:请你判断“\(x\)年是自\(y\)年以来降雨量最多的”这句话的真假。

离散化/\(lower\_bound\)

首先,考虑到年份的范围非常大,便可以离散化。

而我比较懒,反正题目中说了年份是递增的,因此我直接用了\(C++\)自带的\(lower\_bound\)。

\(RMQ\)

这题还需要使用的一个算法便是\(RMQ\)。

这应该是一个比较基础的算法吧,这里就不多加介绍了。

至于哪里需要使用,后面你就知道了。

分类讨论

考虑如果是\(false\),则无非有\(3\)种情况:

  1. 左边界的降雨量已知且小于等于左右边界间的最大降雨量。
  2. 右边界的降雨量已知且小于等于左右边界间的最大降雨量。
  3. 左、右边界降雨量皆已知且左边界降雨量小于右边界降雨量。

这里要求区间最大降雨量,就需要使用前面提到过的\(RMQ\)了。

注意\(RMQ\)查询的区间边界的设定。假设\(dx,dy\)分别为\(x,y\)离散化后的值,则我们求最大值时不能把左右边界算在内。

对于\(dx\),若其恰好在左边界上,则查询时须加\(1\),否则其位置必大于左边界,无需加\(1\)。

对于\(dy\),若其恰好在有边界上,则查询时须减\(1\),否则其位置必大于右边界,同需减\(1\)。可得结论,\(dy\)必减\(1\)。

在确保不是\(false\)的前提下,考虑如果是\(Maybe\),有\(2\)种情况:

  1. 左边界降雨量未知或右边界降雨量未知。
  2. 左右边界间存在降雨量未知。

其中第\(2\)种情况我们可以通过比较左右边界离散化前后的差值是否一样,从而进行判断。

如果不是\(false\)也不是\(maybe\),则自然就是\(true\)。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 50000
#define max(x,y) ((x)>(y)?(x):(y))
#define GetPos(x) (lower_bound(s+1,s+n+1,data(x))-s)
#define Maybe {puts("maybe");continue;}
#define False {puts("false");continue;}
#define True {puts("true");continue;}
using namespace std;
int n;
struct data
{
int Year,Rain;I data(CI x=0,CI y=0):Year(x),Rain(y){}
I bool operator < (Con data& t) const {return Year^t.Year?Year<t.Year:Rain<t.Rain;}
}s[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int f;char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0,f=1;W(!D) f=c^'-'?1:-1;W(x=tn+(c&15),D);x*=f;}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
class RMQ//RMQ求区间最值
{
private:
static const int SZ=N,Log=16;int Log2[SZ+5],Max[SZ+5][Log+5];
public:
I void Init(CI n,data* s)//初始化
{
RI i,j;for(i=1;i<=n;++i) Max[i][0]=s[i].Rain;for(i=2;i<=n;++i) Log2[i]=Log2[i>>1]+1;
for(j=1;(1<<j)<=n;++j) for(i=1;i+(1<<j)<=n;++i) Max[i][j]=max(Max[i][j-1],Max[i+(1<<j-1)][j-1]);
}
I int GetMax(CI l,CI r) {if(l>r) return 0;RI k=Log2[r-l+1];return max(Max[l][k],Max[r-(1<<k)+1][k]);}//区间求Max
}R;
int main()
{
RI Qtot,i,x,y,dx,dy,dv;for(F.read(n),i=1;i<=n;++i) F.read(s[i].Year,s[i].Rain);//读入数据
R.Init(n,s),F.read(Qtot);W(Qtot--)//处理询问
{
F.read(x,y),dx=GetPos(x),dy=GetPos(y),dv=R.GetMax(s[dx].Year^x?dx:dx+1,dy-1);//读入x,y,dx,dy表示离散化后的位置,dv表示左右边界间的最大降雨量
if(!(s[dx].Year^x)&&s[dx].Rain<=dv) False;if(!(s[dy].Year^y)&&s[dy].Rain<=dv) False;//判断左、右边界的降雨量已知且小于等于左右边界间的最大降雨量的情况
if(!(s[dx].Year^x)&&!(s[dy].Year^y)&&s[dx].Rain<s[dy].Rain) False;//判断左、右边界降雨量皆已知且左边界降雨量小于右边界降雨量的情况
if(s[dx].Year^x||s[dy].Year^y||(y-x)^(dy-dx)) Maybe;True;//判断左边界降雨量未知或右边界降雨量未知或左右边界间存在降雨量未知的情况
}return 0;
}

【BZOJ1067】[SCOI2007] 降雨量(RMQ+分类讨论)的更多相关文章

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

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

  2. [BZOJ1067][SCOI2007]降雨量

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

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

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

  4. bzoj1067——SCOI2007降雨量(线段树,细节题)

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

  5. 【线段树 细节题】bzoj1067: [SCOI2007]降雨量

    主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...

  6. BZOJ1067 [SCOI2007]降雨量 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1067 题意概括 给定n组整数对(Xi,Yi),当Xi<Xj且Yi>=Yj时,如果对于任 ...

  7. 洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]

    题目传送门 降雨量 题目背景 07四川省选 题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X ...

  8. [bzoj1067][SCOI2007]降雨量——线段树+乱搞

    题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...

  9. 【bzoj1067】[SCOI2007]降雨量 倍增RMQ

    题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和200 ...

随机推荐

  1. 15.Servlet程序结构与部署

    1.JavaEE应用程序结构 组成:Servlet  JSP  工具类  第三方jar包,HTML页面(图片.Flash) 部署结构: JavaEE应用根目录下的资源都是允许客户端访问的(WEB-IN ...

  2. mysql初始化

    注意:--install前,必须用mysql启动命令的绝对路径 # 制作MySQL的Windows服务,在终端执行此命令: mysqld --install # 移除MySQL的Windows服务,在 ...

  3. 转:zookeeper配置运行——较为详细的教程

    zookeeper:http://blog.csdn.net/morning99/article/details/40426133 dubbo+zookeeper详细:http://www.cnblo ...

  4. SQL Server 如何更改SQL Server和windows身份方式验证

    1.安装sql后先用windows账户登陆进去,然后在sql上右键,选择“安全性”-“SQL Server和windows身份验证模式”然后确定 2.找到安全性——登陆名(sa用户)右键——状态,在登 ...

  5. JqGrid查询数据为空时给表格添加提示信息

    在JqGrid的loadComplete事件中添加下面的代码就可以实现上图的效果 loadComplete: function () { var rowNum = $("#purchaser ...

  6. Mybatis学习笔记4 - 获取自增主键的值

    获取自增主键的值:mysql支持自增主键,自增主键值的获取,mybatis也是利用statement.getGenreatedKeys():useGeneratedKeys="true&qu ...

  7. ajax禁止浏览器缓存

    把cache 设置为false ,把 ifModified 设置为true //工作计划function workprogram(date_time){    $.ajax({        asyn ...

  8. Linux下wget下载软件小技巧以及安装jdk、tomcat与ftp服务器

    一.ftp的安装 装个ftp搞了一下午,感觉以前没那么麻烦的呀,结果到晚上才发现是实验室网的问题,换连手机的热点马上可以了,真是尴尬,把基本安装步骤记录一下: 1.检查安装vsftpd软件 使用如下命 ...

  9. Beam的抽象模型

    不多说,直接上干货! Apache Beam抽象模型 计算机最简单的抽象模型是输入+计算+输出.对于数据处理类的应用来说,将计算的部分展开,变成了  数据输入  +  数据集  +  数据处理  + ...

  10. Get和Post区别,EncType提交数据的格式详解——转自他人博客的

    1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过 ...