题目链接P2471 [SCOI2007]降雨量

听说博客观看效果更佳
  

这道题是比较经典的 RMQRMQRMQ 问题,找到X和Y年间的最值来进行判断真假 , 用线段树维护是比较简单好写的。然而这只是一个小判断,比较难的是判断 maybemaybemaybe 。如果没有想好直接打代码会调很久(没错就是我)。怎么维护查询区间最大值我就不再这里赘述了,不懂线段树的先去入门(此题也是线段树入门题)。我讲几个很坑的点(比较坑我的点):

  1.询问的X年降雨量不超过Y,但是中间年份降雨量一定小于X(注意X和Y顺序)。

  2.X可能等于Y+1年,也就是不用考虑中间年份。

  3.区间查询最值的操作要留意范围,不同情况下查询的范围是不一样的,这点需要自己理解。

  4.错的最多的 maybemaybemaybe 和 falsefalsefalse 的判断,要清楚知道哪个是已知量,哪个是未知量(特别是X和Y是未知量的时候)。

  本题中我分了四种情况分析,还有众多 ififif 和 elseelseelse ,需要格外小心。我对输出进行简化,应该会更加直观一点。

Code

#include<bits/stdc++.h>
using namespace std;
#define For(i,sta,en) for(int i = sta;i <= en;i++)
#define lowbit(x) x&(-x)
#define mid (l+r)/2
#define ls(x) x<<1
#define rs(x) x<<1|1
#define speedUp_cin_cout ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);
typedef long long ll;
typedef __int128 lll;
const int maxn = 2e5+9;
int t[maxn],n,m;  //t 记录区间最大值
int year[maxn],rain[maxn];void update(int now,int l,int r,int pos,int value){if(l == r) {t[now] = value;return;}if(pos <= mid) update(ls(now),l,mid,pos,value);else update(rs(now),mid+1,r,pos,value);t[now] = max(t[ls(now)],t[rs(now)]);  //维护区间最大值
}int query(int now,int l,int r,int x,int y){  //询问x到y区间最大值if(x <= l&&r <= y) return t[now];int an = 0;if(x <= mid) an = query(ls(now),l,mid,x,y);if(y > mid) an = max(an,query(rs(now),mid+1,r,x,y));return an;
}
int main(){speedUp_cin_cout  //读写优化#define maybe cout<<"maybe"<<endl;continue;//让输出没这么难看#define false cout<<"false"<<endl;continue;#define true cout<<"true"<<endl;continue;cin>>n;int y,r;For(i,1,n)  {cin>>y>>r;year[i] = y;rain[i] = r;update(1,1,n,i,r);}cin>>m;int Y,X,p1,p2,f1,f2; //p1 p2是在数组的位置,f1 f2两个标记记录X Y是否已知降水量For(i,1,m){cin >> Y >> X;p1 = lower_bound(year+1,year+1+n, Y) - year; //year在输入时保证是有序的p2 = lower_bound(year+1,year+1+n, X) - year;f1 = (p1 == n + 1|| year[p1] != Y) ? 0 : 1;f2 = (p2 == n + 1 ||year[p2] != X) ? 0 : 1;//两年都不知道,可以不管中间如何,都是未知的if(!f1 && !f2) {maybe}//两年都知道if(f1 && f2) {if(rain[p1] < rain[p2]) {false}        //X年降水量多于Y年,错if(Y + 1 == X ) {true}                 //X = Y+1年,中间没有其他年份,而X年降水量一定不大于Y,对if(p1 + 1 == p2) {maybe}               //X不是Y后一年,但是X和Y年间都不知道降雨量,未知int maxGap = query(1,1,n,p1+1,p2-1);   //X和Y间存在已知降水量的年份,在其中找到降雨量最大值if(maxGap >= rain[p2]) {false}         //大于等于都满足严格小于,错if(p2 - p1 == X - Y) {true}            //满足严格小于后再判断X和Y间每年降雨量是否都已知else maybe                             //不是都已知,即未知}//后一年不知道,p2 一定大于 p1,只可能是maybe或者falseelse if(f1){if( p1 + 1 == p2 ) {maybe}int maxGap = query(1,1,n,p1+1,p2-1);   //注意查询范围if(maxGap >= rain[p1]) { false }else maybe}//前一年不知道,p1 有可能等于 p2,只可能是maybe或者falseelse{if(p1  == p2 ) {maybe}int maxGap = query(1,1,n,p1,p2-1);    //注意查询范围if(maxGap >= rain[p2]) { false }else { maybe }}}return 0;
}

希望大家都能一次AC这道题<( ̄︶ ̄)↗[GO!]

[SCOI2007]降雨量 线段树和区间最值(RMQ)问题相关推荐

  1. BZOJ-4811: [Ynoi2017]由乃的OJ (树链剖分 线段树维护区间操作值 好题)

    4811: [Ynoi2017]由乃的OJ Time Limit: 6 Sec  Memory Limit: 256 MB Submit: 366  Solved: 118 [Submit][Stat ...

  2. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

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

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

  4. POJ——3624 Balanced Lineup(线段树入门——区间最值问题)

    原题链接:http://poj.org/problem?id=3264 每天挤奶时,农夫John的N头奶牛(1≤N≤50,000头)总是按照相同的顺序排列.一天,农夫约翰决定和几头牛组织一场极限飞盘游 ...

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

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

  6. 【线段树】区间修改(区间覆盖、区间权值加)标记下放操作的逻辑顺序

    洛谷传送门:月下"毛景树" 由于没有合适的题目,就从这道题入手,解此题时用到的算法/数据结构包括: 树链剖分 线段树(区间覆盖.区间加.区间查询.单点修改) 这道题被我调试了四个小 ...

  7. szu 寒训个人复习第一天 线段树入门单点修改,区间修改,以及线段树的扩展运用[线段树+dp][区间最大公约数]

    寒讯内容有点过多(其实是我太菜了)水一波怕忘了(人老了)**什么是线段树** 线段树是本蒟蒻感觉用处特别大的算法 那么线段树上面的节点表示什么意思呢? 线段树,上面的节点表示一个区间,父亲节点表示的区 ...

  8. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ : $2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ , ...

  9. 线段树练习——区间合并

    这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解) hdu 3308 http://acm.hdu.edu.cn/showproblem.p ...

最新文章

  1. 程序员:我不学Python了!!
  2. 80后,从爱情,到婚姻
  3. 使用Apache搭建个人用户主页
  4. c语言绘制路面图形代码,道路纵断面绘图程序的开发.pdf
  5. idea struts插件_使用Struts 2的查询网格(无插件)
  6. 迅雷下载Linux Oracle11gR2和Oracle12c
  7. 手把手带你入门Python爬虫(一、工欲善其事必先利其器)
  8. ajax请求携带tooken_9 HTMLJS等前端知识系列之Ajax post请求带有token向Django请求
  9. jni 从c传递map到java_java_jni 本地调用接口DLL的编写样本,涉及数组传递,相关的 和C程序均已包括。 Develop 256万源代码下载- www.pudn.com...
  10. 这个Javascript“要求”是什么?
  11. python windows自动化 爬虫_Python体系(网络爬虫、人工智能、WEB开发、自动化运维)详细介绍...
  12. 团队项目-个人博客-4.27
  13. windows10应用商店加速方法
  14. 免费开源!仿微信仿陌陌类APP源代码整项目开源,包括ADT项..
  15. 17-sendto函数和异步错误
  16. 京东员工p级别分几级_一文揭秘字节跳动、华为、京东的薪资职级
  17. Django的语言模板
  18. 火遍日本 IT 界的深度学习入门书,你读完了吗?
  19. 微信小程序授权之getuserInfo
  20. Java的小数点后精度计算

热门文章

  1. 互斥事件的概念和公式_专题49 互斥事件和独立事件的概率及条件概率(打包)-2019年高考数学(理)名师揭秘之一轮总复习...
  2. 文件存储 云服务器,文件存储 云服务器
  3. 程序员那些神仙注释和必备模板
  4. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken
  5. 基于SpringBoot旅游信息管理系统网站
  6. 高新企业申报是什么?需要怎么申请?
  7. 使用云服务器和物理机的区别是什么
  8. 软考信息安全工程师学习笔记六(未完待续)
  9. 前端性能测试工具hiper介绍
  10. win10环境下AndroidStudio输入法光标不跟随解决办法