题目描述

我们常常会说这样的话:“X 年是自 Y 年以来降雨量最多的”。它的含义是 X 年的降雨量不超过 Y 年,且对于任意 Y<Z<X,Z 年的降雨量严格小于 X 年。例如 2002,2003,2004 和 2005 年的降雨量分别为 4920,5901,2832 和 3890,则可以说“2005 年是自 2003 年以来最多的”,但不能说“2005 年是自 2002 年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。

输入格式

输入仅一行包含一个正整数 nnn,为已知的数据。以下 n 行每行两个整数yiy_iyi​和rir_iri​,为年份和降雨量,按照年份从小到大排列,即yi<yi+1​y_i<y_{i+1}​yi​<yi+1​​。下一行包含一个正整数 m,为询问的次数。以下 m 行每行包含两个数 Y 和 X ,即询问“X 年是自 Y 年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

样例

6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008

输出格式

对于每一个询问,输出true,false或者maybe
false
true
false
maybe
false

算法简述

用线段树维护年份区间的最大值,并同时记录区间的连续性,查询即可

细节

如何判断区间连续?

若连续,则左区间连续,右区间连续,且左区间右端点和右区间左端点差为1
否则不连续

线段树

排序,用下标建树

代码实现

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<climits>
#include<cctype>
#include<vector>
#include<map>
#include<queue>
#include<set>
#include<string>
#include<stack>
#include<string>
#include<string.h>
using namespace std;
#pragma GCC optimize(2)
#pragma warning(disable:4996)using namespace std;
const int maxn = 60000;
struct node
{int y, v;
}a[maxn];
struct ans
{int flg, v;//flg标记这个节点维护的区间是否连续,v表示这个区间的最大降水量
};
ans maxr[maxn << 2];
int n;
void build(int x, int l, int r)
{if (l == r){maxr[x] = { 1,a[l].v };return;}int mid = l + (r - l) / 2;build(x << 1, l, mid);build(x << 1 | 1, mid + 1, r);maxr[x].v = max(maxr[x << 1].v, maxr[x << 1 | 1].v);if (a[mid + 1].y - a[mid].y == 1 && maxr[x << 1].flg && maxr[x << 1 | 1].flg)//如果左右节点区间连续,且左区间连续右区间也连续,x节点维护的区间就是连续的{maxr[x].flg = 1;}else{maxr[x].flg = 0;}}
ans query(int x, int l, int r, int ql, int qr)//询问y[ql]到y[qr]年的最大值
{if (l >= ql && r <= qr){return maxr[x];}int mid = (l + r) >> 1;ans res, tmp;res.flg = 1;res.v = INT_MIN;bool f1=0, f2=0;if (ql <= mid){f1 = 1;tmp = query(x << 1, l, mid, ql, qr);res.v = max(res.v, tmp.v);if (!tmp.flg)//如果左右有一部分不连续,那么这个返回指就不连续{res.flg = 0;}}if (qr > mid){f2 = 1;tmp = query(x << 1 | 1, mid + 1, r, ql, qr);res.v = max(res.v, tmp.v);if (!tmp.flg){res.flg = 0;}}if (f1 && f2){if (a[mid + 1].y - a[mid].y != 1){res.flg = 0;}}return res;
}
inline int search_upper(int x)//搜索大于等于x年的下标
{int l = 1, r = n, mid, res = INT_MIN;while (l <= r){mid = (l + r) >> 1;if (a[mid].y == x){return mid;}if (a[mid].y > x){res = mid;r = mid - 1;}else{l = mid + 1;}}return res;
}
inline int search_lower(int x)//搜索一个小于等于x年的下标
{int l = 1, r = n, mid, res = INT_MIN;while (l <= r){mid = (l + r) >> 1;if (a[mid].y == x){return mid;}else if (a[mid].y < x){res = mid;l = mid + 1;}else{r = mid - 1;}}return res;
}
int main()
{//freopen("data.in", "r", stdin);//freopen("result.out", "w", stdout);scanf("%d", &n);for (int i = 1; i <= n; i++){scanf("%d%d", &a[i].y, &a[i].v);//y是年份,v是降雨量}build(1, 1, n);int m; scanf("%d", &m);while (m--){int l, r; scanf("%d%d", &l, &r);if (r <= l){cout << "false\n";continue;}if (l >= a[n].y || r <= a[1].y){cout << "maybe\n";continue;}int L = search_upper(l);int R = search_lower(r);if (a[L].y == l && a[R].y == r){if (a[L].v >= a[R].v){if (R - L == 1){if (a[R].y - a[L].y == 1) cout << "true\n";else cout << "maybe\n";continue;}ans res = query(1, 1, n, L + 1, R - 1);if (res.v >= a[R].v){cout << "false\n";}else{if (res.flg && a[L + 1].y == l + 1 && a[R - 1].y == r - 1){cout << "true\n";}else{cout << "maybe\n";}}}else{cout << "false\n";}}else if (a[R].y == r){if (r - l == 1){cout << "maybe\n";continue;}if (R == L){cout << "maybe\n";continue;}int RR = search_lower(r - 1);if (RR < L){cout << "maybe\n";continue;}ans res = query(1, 1, n, L, RR);if (res.v >= a[R].v){cout << "false\n";}else{cout << "maybe\n";}}else if (a[L].y == l){if (r - l == 1){cout << "maybe\n";continue;}int LL = search_upper(l + 1);int RR = search_lower(r - 1);if (RR < LL){cout << "maybe\n";continue;}ans res = query(1, 1, n, LL, RR);if (res.v >= a[L].v){cout << "false\n";}else{cout << "maybe\n";}}else{cout << "maybe\n";}continue;}
}
//-19 -8

有用点个赞呗@_@

P2471 [SCOI2007]降雨量(线段树)相关推荐

  1. [SCOI2007]降雨量 线段树和区间最值(RMQ)问题

    题目链接P2471 [SCOI2007]降雨量 听说博客观看效果更佳    这道题是比较经典的 RMQRMQRMQ 问题,找到X和Y年间的最值来进行判断真假 , 用线段树维护是比较简单好写的.然而这只 ...

  2. BZOJ1067: [SCOI2007]降雨量(线段树)

    题意:传送门 题解:这个题超级繁琐,参考传送门,传送门,我觉得本题的重点在于如何在线段树上加信息,使得中间漏掉的年份得以知道,有两种方法,通过维护区间和,提前建树时将不相邻年份设为0,还有一种方法是加 ...

  3. (线段树)洛谷 P2471 [SCOI2007]降雨量

    原题地址 https://www.luogu.com.cn/problem/P2471 解题思路 准备 好像只有我维护了两棵线段树? 先定义一个 rain\textit{rain}rain 数组存放降 ...

  4. 【数据结构2-2】线段树与树状数组 题解

    头一次老老实实写完一个官方题单,发篇题解纪念一下-- 文章目录 P3372 [模板]线段树 1 P3373 [模板]线段树 2 P4588 [TJOI2018]数学计算 P1502 窗口的星星 P24 ...

  5. [BZOJ1067][SCOI2007]降雨量(线段树)

    题目描述 传送门 题解 离线离散化, 声明的年份和查找的年份一起建线段树. 线段树维护一下区间最大值,两个点之间是否有没有声明的年份打标记. 判断比较吃屎. 我大的分了两种情况:一个是需要在线段树中查 ...

  6. 1067: [SCOI2007]降雨量

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2148  Solved: 554 [Submit][Statu ...

  7. scoi2007降雨量

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 1096  Solved: 241 [Submit][Statu ...

  8. 1067: [SCOI2007]降雨量 - BZOJ

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

  9. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

最新文章

  1. iOS 查询数组中的对象
  2. Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况...
  3. ZZ: How to remove 'Open in Windows Explorer' from the 'Actions Menu'
  4. 面试英语自我介绍的常用词汇
  5. 区分错误类型_数仓|几种SQL隐藏的错误,你遇到过吗?
  6. 怎么调出matlab的函数,matlab定义函数【搞定方法】
  7. (转)淘淘商城系列——导入商品数据到索引库——Service层
  8. 上传本地代码到github从github下载源码
  9. Atitit避免出现空指针异常解决方案
  10. php ob系列的函数
  11. 魏俊妮《非人力资源的人力资源管理技术提升》课程大纲
  12. ISE14.7添加工程外部的IP核
  13. Appium学习笔记16-按下、抬起、等待、移动、点击
  14. 阴历阳历的相互转换(支持1900~2100年) 1
  15. 从零开始自制实现WebServer(十九)---- 正式系统的学习一下Git 捣鼓捣鼓github以及一些其他的小组件
  16. 最新YGBOOK小说站源码/全自动采集+已修BUG
  17. Unreal Engin_画廊制作笔记 _008灯光处理,夜晚的画廊灯光设置
  18. ModuleNotFoundError: No module named ‘pip‘;ERROR: Could not find a version that satisfies the requir
  19. idea必备开发插件.
  20. mtk lcm驱动加载流程

热门文章

  1. 浅谈PageRank算法
  2. 如何用VBA快速批量提取多个工作表名称?
  3. MongoDB 查询昨日/昨天数据
  4. 免屏实现精准较时设定,WT588F02B-8S(C006_03)电子语音药盒解决方案
  5. 帝国php调用文章列表,帝国CMS模板中:使用php调用最新文章的代码(非灵动和万能标签)...
  6. 面试笔记:面经-瓜子
  7. 第一次打CF的感受(附A-C题题解) -Codeforces Round #764 (Div. 3)
  8. 闭环系统的零极点图判定稳定性_系统的稳定性判别
  9. 数智学习|湖仓一体实践与探索
  10. 【历史上的今天】11 月 20 日:微软发布 Windows 1.0;Lotus Notes 发明者出生;奔腾4 诞生