[BZOJ1067][SCOI2007]降雨量
[BZOJ1067][SCOI2007]降雨量
试题描述
我们常常会说这样的话:“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。
输入示例
输出示例
false
true
false
maybe
false
数据规模及约定
100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9
题解
分类大讨论。
本题考点:if 语句的应用。本题难点:分类讨论的完整性。
被 lower_bound 坑了,lower_bound 找的是大于等于 x 的最小值,我给记成小于等于 x 的最大值了。。。。。。。。。。。。。。。。。。。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *tail;
inline char Getchar() {
if(Head == tail) {
int l = fread(buffer, 1, BufferSize, stdin);
tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = Getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
return x * f;
} #define maxn 50010
int n, q, year[maxn], rain[maxn]; int maxv[maxn<<2], mxy[maxn<<2], mny[maxn<<2];
bool iss[maxn<<2];
void build(int L, int R, int o) {
if(L == R) maxv[o] = rain[L], mxy[o] = mny[o] = year[L], iss[o] = 1;
else {
int M = L + R >> 1, lc = o << 1, rc = lc | 1;
build(L, M, lc); build(M+1, R, rc);
maxv[o] = max(maxv[lc], maxv[rc]);
iss[o] = iss[lc] & iss[rc] & (mxy[lc] - mny[rc] == -1);
mny[o] = mny[lc]; mxy[o] = mxy[rc];
}
return ;
}
int _o[maxn<<2], cnt;
int query(int L, int R, int o, int ql, int qr) {
if(ql > qr) return -1;
if(ql <= L && R <= qr) {
_o[++cnt] = o;
return maxv[o];
}
int M = L + R >> 1, lc = o << 1, rc = lc | 1, ans = 0;
if(ql <= M) ans = max(ans, query(L, M, lc, ql, qr));
if(qr > M) ans = max(ans, query(M+1, R, rc, ql, qr));
return ans;
}
bool qq() {
bool ok = 1;
for(int i = 1; i <= cnt; i++) ok &= iss[_o[i]];
for(int i = 1; i < cnt; i++) ok &= (mxy[_o[i]] - mny[_o[i+1]] == -1);
return ok;
} int main() {
n = read();
for(int i = 1; i <= n; i++) year[i] = read(), rain[i] = read();
build(1, n, 1);
q = read();
while(q--) {
int yl = read(), yr = read(),
ql = lower_bound(year + 1, year + n + 1, yl) - year,
qr = lower_bound(year + 1, year + n + 1, yr) - year;
if(year[ql] != yl) ql--;
if(year[qr] != yr) qr--;
int ans; cnt = 0;
if(yl > yr){ puts("false"); continue; }
if(yl == yr){ puts("true"); continue; }
if(yl >= year[n]){ puts("maybe"); continue; }
if(yr <= year[1]){ puts("maybe"); continue; }
if(yl < year[1] && yr > year[n]){ puts("maybe"); continue; }
if(year[ql] == yl && yr > year[n] && query(1, n, 1, ql+1, n) >= rain[ql]){ puts("false"); continue; }
if(year[ql] != yl && yr > year[n]){ puts("maybe"); continue; }
if(year[qr] == yr && yl < year[1] && query(1, n, 1, 1, qr-1) >= rain[qr]){ puts("false"); continue; }
if(year[qr] != yr && yl < year[1]){ puts("maybe"); continue; }
if(yl == yr - 1) {
if(year[ql] == yl && year[qr] == yr) {
if(rain[ql] >= rain[qr]) puts("true");
else puts("false");
}
else puts("maybe");
continue;
}
if(year[ql] == yl && year[qr] == yr && rain[ql] >= rain[qr] && query(1, n, 1, ql+1, qr-1) < rain[qr]) {
cnt = 0; query(1, n, 1, ql, qr);
if(qq()){ puts("true"); continue; }
}
if(year[ql] == yl && year[qr] == yr) {
if(rain[ql] < rain[qr]){ puts("false"); continue; }
if(query(1, n, 1, ql+1, qr-1) >= rain[qr]){ puts("false"); continue; }
}
if(year[ql] == yl && query(1, n, 1, ql+1, qr) >= rain[ql]){ puts("false"); continue; }
if(year[qr] == yr && query(1, n, 1, ql+1, qr-1) >= rain[qr]){ puts("false"); continue; }
puts("maybe");
} return 0;
}
[BZOJ1067][SCOI2007]降雨量的更多相关文章
- 【线段树 细节题】bzoj1067: [SCOI2007]降雨量
主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...
- BZOJ1067 [SCOI2007]降雨量 RMQ???
求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...
- BZOJ1067 [SCOI2007]降雨量 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1067 题意概括 给定n组整数对(Xi,Yi),当Xi<Xj且Yi>=Yj时,如果对于任 ...
- bzoj1067——SCOI2007降雨量(线段树,细节题)
题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002 ...
- [bzoj1067][SCOI2007]降雨量——线段树+乱搞
题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...
- 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判
[BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...
- bzoj 1067: [SCOI2007]降雨量 模擬
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2010 Solved: 503[Submit][Status] ...
- 1067: [SCOI2007]降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2148 Solved: 554[Submit][Status] ...
- bzoj 1067: [SCOI2007]降雨量
题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...
随机推荐
- 趋势or过渡,量子点屏幕真的优于OLED?
[导读]谁都知道买电视就是要买看起来很爽的产品,但怎么界定这个“爽”字?大部分人所知的是屏幕要够大,再近一步就是分辨率要够高——在这个4K分辨率逐步进入寻常家庭的时代,这两者已经不是选购屏幕类产品的大 ...
- 获取Web.config配置节
static string GetAppSetting(string key) { var appSetting = ConfigurationManager.AppSettings[key]; if ...
- 第三十二课:JSDeferred的性能提速
大家如果看了前面两课,就知道Deferred的静态方法next(next_default)是用setTimeout实现的(有浏览器最小时钟间隔).但是实现这种异步操作,可以有很多种方法.JSDefer ...
- jQuery应用之(二)使用jQuery管理选择结果(荐)
使用jQuery选择出来的元素与数组非常类似,可以通过jQuery提供的一系列方法对其进行处理,包括长度.查找某个元素,截取某个段落等. 1.获取元素的个数. 在jQuery中可以通过size()方法 ...
- linux oracle磁盘满了
最近,查看我们一台linux服务器,发现硬盘空间都已经使用了95%,很是疑惑啊,怎么回事那?难道是数据库文件太大了? Filesystem Size Used Avail Us ...
- DELL R710服务器做RAID5磁盘阵列图文教程
本文转载于:http://www.jb51.net/article/53707.htm,只为做笔记使用 同时我们还可以选择一块硬盘做热备盘,就是说当配的raid5中有一个硬盘坏了的时候,它立马顶上,然 ...
- FastDFS在.Net平台上的使用
上一篇,了解了FastDFS是什么东东,一般稍微大一的网站都会做文件分离存储,FastDFS这轻型的分布式文件存储方式,非常有用. 此图片截取博友(张占岭)的勿喷 下面我们就了解一下,FastDFS在 ...
- int和integer的比较
程序代码: Integer i01 = 59; int i02 = 59; Integer i03 =Integer.valueOf(59); Integer i04 = new Integer(59 ...
- Oracle使用JDBC进行增删改查
数据库和表 create table USERS( USERNAME VARCHAR2(20) not null, PASSWORD VARCHAR2(20))alter table USERS ...
- BZOJ-4195 NOI2015Day1T1 程序自动分析 并查集+离散化
总的来说,这道题水的有点莫名奇妙,不过还好一次轻松A 4195: [Noi2015]程序自动分析 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 836 ...