题解 P2471 【[SCOI2007]降雨量】
原题传送门
前置芝士
离散化
ST表和RMQ问题
二分
正文
首先我们来分析一下题意。
题目会给出两个大小为 \(n\) 的数组,\(y\) 和 \(r\) ,其中 \(y_i\) 表示第 \(i\) 个年份是第几年,\(r_i\) 表示的是第 \(y_i\) 年的降雨量。之后,将会有 \(m\) 次询问,每次询问给出两个年份 \(Y\) 和 \(X\) ,若用 Z 表示 \(Y\) 和 \(X\) 之间的年份,则我们要判断的是三个年份的降雨量是否满足 \(Y\geqslant X>Z\) ,根据判断结果输出不同的话。
很显然,这是一个 \(RMQ\) 问题, \(RMQ\) 问题有多种方式解决,下面将只给出 \(ST\)表的解法。(其实我不会线段树,单调栈也忘记怎么写了)
这道题看似是一道水题,其实它有非常多的坑点,因为题目中的 \(Y,X,Z\) 之间会有很多种大小关系,而对于每一种关系,我们都要判断输出的结果是 \(true\) ,\(false\) ,还是 \(maybe\) ,这就使得这道题会让人变得非常头疼。
对于 \(Y,X,Z\) 三者之间大小关系的分析,将直接在代码中给出。
然而,我们并不是只需判断 \(Y,X,Z\) 之间的关系,在某些情况下,我们还需判断 \(Y,X\) 之间所有年份的降水量是否已知。为了防止超时爆零,我们不能直接用 \(for\) 循环枚举判断,但是我们可以利用二分法查找中间年份,这样就不会超时。
因为这题的数据范围特别大, \(y_i\) 在 \(\pm 10^9\) 之间,我们不可能定义一个大小有 \(2*10^9\) 的数组来存储每一年的降水量,所以我们需要对所给的年份进行离散化处理。但是,题目中所给出的年份本来就是从小到大排列的,这就帮我们省去了离散化的步骤(即给出的已经处于离散化状态),我们只要直接按照所给顺序做就行。
代码如下:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int N=50005;
int a[N],b[N],d[N][20],lg[N]= {-1};
int n,m;
int query(int x) {
return lower_bound(a+1,a+1+n,x)-a;
}
void RMQ_init(int n) {
for (int i=1; i<=n; i++) {
d[i][0]=b[i];
lg[i]=lg[i/2]+1;
}
for (int j=1; 1<<j<=n; j++) {
for (int i=1; i+(1<<j)-1<=n; i++) {
d[i][j]=max(d[i][j-1],d[i+(1<<j-1)][j-1]);
}
}
}
int RMQ(int l,int r) {
if (l>r) return -1;
int k=lg[r-l+1];
return max(d[l][k],d[r-(1<<k)+1][k]);
}
int main() {
scanf("%d",&n);
for (int i=1; i<=n; i++) scanf("%lld %lld",&a[i],&b[i]);
RMQ_init(n);
scanf("%d",&m);
for (int _=1; _<=m; _++) {
ll o,p;
scanf("%lld %lld",&o,&p);
int x=query(p),y=query(o);
int rmq=RMQ(y+1,x-1);
if (y>x) {
puts("false");
} else {
if (x<=n && a[x]==p) {
//x年份存在
if (y<=n && a[y]==o) {
//y年份存在
bool now=1;
if (rmq==-1) {
//x,y中间无已知年份时
if (b[x]<=b[y]) { //x的降雨量小于等于y
if (p-o==x-y) puts("true"); //x,y为连续的两年
else puts("maybe");//x,y中间有其他年份
} else {
puts("false");//x的降雨量大于y
}
now=0;
}
if (!now) goto M;
if (b[y]<b[x] || b[x]<=rmq) {
//y年降雨量比x年小或者x~y之间有一年的降雨量大于x年
puts("false");
} else {
//b[y]>b[x]>rmq
if (x-y!=p-o) {
//第i年的降雨量未知
puts("maybe");
} else puts("true"); //中间年份全部存在
}
} else {
//y年不存在
if (RMQ(y,x-1)>=b[x]) {
//ps:此时,第一个降雨量大于等于p的年份,
// 也就是中间年份的第一项就是y。
//中间年份存在降雨量大于等于x年的一年
puts("false");
} else {
//y年不存在,无论中间年份降雨量如何,结果都是未知的
puts("maybe");
}
}
} else {
//x年不存在
if (y<=n && a[y]==o) {
//y年存在
if (rmq>=b[y]) puts("false"); //rmq>=a[y]时
else puts("maybe");//a[y]>rmq时,x年未知
} else puts("maybe");//x,y都未知时。
}
}
M:;
}
return 0;
}
祝各位大佬早日 \(AKIOI\) 。
题解 P2471 【[SCOI2007]降雨量】的更多相关文章
- 洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]
题目传送门 降雨量 题目背景 07四川省选 题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X ...
- P2471 [SCOI2007]降雨量
Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2 ...
- BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...
- 洛谷P2471——[SCOI2007]降雨量
本机AC提交RE…… 传送门:QAQQAQ 题意:自己看 思路:据说这道题用RMQ做很快,但这道题线段树是可以的 线段树维护一段区间最左年,最右年,是否有间隙和区间最大值 这道题分类讨论是一大难点,主 ...
- 【线段树 细节题】bzoj1067: [SCOI2007]降雨量
主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...
- [BZOJ1067][SCOI2007]降雨量
[BZOJ1067][SCOI2007]降雨量 试题描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格 ...
- 1067: [SCOI2007]降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2148 Solved: 554[Submit][Status] ...
- 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判
[BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...
- bzoj 1067: [SCOI2007]降雨量
题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...
- bzoj 1067: [SCOI2007]降雨量 模擬
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2010 Solved: 503[Submit][Status] ...
随机推荐
- Python 数据科学手册:读书笔记概论
为防止遗忘,在空闲时间将读书的笔记开始按照章节进行概括总结(2022.1.1): 第二章:NumPy 入门 第三章:Pandas 数据处理 第四章:Matplotlib 数据可视化 第五章:机器学习 ...
- Thread和Runnable的区别和匿名内部类方式实现线程的创建
如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享. 总结:实现Runnable接口比继承Thread类所具有的优势: 1.适合多个相同的程序代 ...
- docker多段构建nessus镜像
1.构建基础镜像,主要做安装和获取注册号: FROM ubuntu:16.04 ADD Nessus-8.11.0-debian6_amd64.deb /tmp/Nessus-8.11.0-debia ...
- 多重分派(multiple dispatch)与访问者模式
什么是双重分派 什么是分派(dispatch) 首先我们需要理解「分派」的含义.分派就是将方法调用与对应的具体方法绑定起来.而判断的依据有两点,这两者可称为「宗量」: 方法的接收者,也就是哪个对象调用 ...
- VirtualBox 相关命令行
简介 由于之前项目有一个需求,则是自动化创建虚拟机并加载相关配置,创建虚拟机无法避免对于虚拟机系统的设置,因此采用导入虚拟机的方式,并通过查阅virtualbox相关手册,知晓virtualbox可以 ...
- 论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement
论文地址:单耳语音增强的时频注意 引用格式:Zhang Q, Song Q, Ni Z, et al. Time-Frequency Attention for Monaural Speech Enh ...
- 游戏开发常遇到数据一致性BUG,怎么解?
摘要:数据副本强一致.全节点可写.存储全面降本,GaussDB(for Redis)重新定义游戏数据库,彻底修复一致性BUG. 本文分享自华为云社区<华为云GaussDB(for Redis)揭 ...
- 重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!
点击上方 蓝字关注我们 社区的小伙伴们,好消息!经过 100 多位社区贡献者近 10 个月的共同努力,我们很高兴地宣布 Apache DolphinScheduler 2.0 alpha 发布.这是 ...
- 【安全通告】关于 DolphinScheduler 漏洞情况的说明
点击上方 蓝字关注我们 [安全通报] [影响程度:低] Apache DolphinScheduler 社区邮件列表最近通告了 1 个漏洞,考虑到有很多用户并未订阅此邮件列表,我们特地在此进行情况说明 ...
- ApacheCon 首次亚洲大会 —— Incubator 专场介绍
Apache 孵化器即为想要进入 Apache 软件基金会(ASF)的项目提供相关帮助和服务.它帮助进入的项目(称为"podling")采用 Apache 的治理风格,并引导使用 ...