1067: [SCOI2007]降雨量

Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 2918 Solved: 746
[Submit][Status][Discuss]
Description

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

Input

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

Output

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

Sample Input

6

2002 4920

2003 5901

2004 2832

2005 3890

2007 5609

2008 3024

5

2002 2005

2003 2005

2002 2007

2003 2007

2005 2008
Sample Output

false

true

false

maybe

false
HINT

100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

Source

POJ 2637 WorstWeather Ever
绝世污题,本以为maybe加一个know就可以了,没想到分类讨论污得不行,线段树+分类讨论,在这里感谢DaD3zZ和hzwer学长帮助我。。
附上本蒟蒻的代码:

#include<cstdio>
#include<iostream>
using namespace std;
struct edge
{int value,lq,rq;//lq是该节点控制的左区间,rq同理bool know;//表示此年份有无数据
};
edge node[200001];
int n,m,i,x,y,xrain,yrain,pre,next,f;void update(int s)
{node[s].know=node[s*2].know&&node[s*2+1].know;//该节点know标记是左右子树know标记的&&if (node[s*2].rq+1!=node[s*2+1].lq)node[s].know=false;//左右子树区间结合,如果不等表示中间有未知年份node[s].lq=node[s*2].lq;//更新该节点控制区间node[s].rq=node[s*2+1].rq;node[s].value=max(node[s*2].value,node[s*2+1].value);
}void build(int s,int l,int r)
{if (l==r){scanf("%d %d",&node[s].lq,&node[s].value);node[s].rq=node[s].lq;node[s].know=true;//已知年份标记truereturn;}build(s*2,l,(l+r)/2);build(s*2+1,(l+r)/2+1,r);update(s);
}int get(int s,int k)//单点查询
{if (node[s].lq==node[s].rq)if (node[s].lq!=k)return 0;elsereturn node[s].value;if (k<=node[s*2].rq)return get(s*2,k);elseif (k>=node[s*2+1].lq)return get(s*2+1,k);return 0;
}int ask(int s,int x,int y,int num)//0表示false,1表示true,2表示maybe
{bool flag=false;if (x<node[s].lq){flag=true;x=node[s].lq;}if (node[s].lq==x && node[s].rq==y){if (node[s].value>=num)return 0;elseif (node[s].know && !flag)return 1;elsereturn 2;}if (y<=node[s*2].rq)return ask(s*2,x,y,num);elseif (x>=node[s*2+1].lq)return ask(s*2+1,x,y,num);else{int f1=ask(s*2,x,node[s*2].rq,num);int f2=ask(s*2+1,node[s*2+1].lq,y,num);if (!f1 || !f2)return 0;elseif (node[s*2].rq+1!=node[s*2+1].lq)return 2;elsereturn 1;}
}int getnext(int s,int k)//该节点的后一个已知降雨量的年份(可以为自身)
{int l=node[s].lq,r=node[s].rq;if (l==r)return node[s].lq;if (k<node[s*2].rq)return getnext(s*2,k);elsereturn getnext(s*2+1,k);
}int getlast(int s,int k)//该节点的前一个已知降雨量的年份(可以为自身)
{int l=node[s].lq,r=node[s].rq;if (l==r)return node[s].lq;if (k>node[s*2+1].lq)return getlast(s*2+1,k);elsereturn getlast(s*2,k);
}int main()
{scanf("%d",&n);build(1,1,n);//建树,有点麻烦。。scanf("%d",&m);for (i=1;i<=m;i++){scanf("%d %d",&x,&y);//以下是分类讨论if (y<x){printf("%s\n","false");continue;}xrain=get(1,x);yrain=get(1,y);if (!xrain && !yrain)//如果未知,输出maybeprintf("%s\n","maybe");else{pre=getnext(1,x);next=getlast(1,y);if (!xrain){if (pre>next || y==next){printf("%s\n","maybe");continue;}f=ask(1,pre,next,yrain);if (f==0)printf("%s\n","false");elseprintf("%s\n","maybe");}elseif (!yrain){if (pre>next || x==pre){printf("%s\n","maybe");continue;}f=ask(1,pre,next,xrain);if (f==0)printf("%s\n","false");elseprintf("%s\n","maybe");}else{if (yrain>xrain){printf("%s\n","false");continue;}if (pre>next){if (x+1==y)printf("%s\n","true");elseprintf("%s\n","maybe");continue;}f=ask(1,pre,next,yrain);if (f==0)printf("%s\n","false");elseif (f==1){if (x+1==pre && y-1==next)printf("%s\n","true");elseprintf("%s\n","maybe");}elseif (ask(1,pre,next,yrain)==2)printf("%s\n","maybe");elseprintf("%s\n","false");}}}return 0;
}

题解写得比较简略,分类讨论如有不懂,安利几个神犇的博客:
http://hzwer.com/1655.html
http://blog.csdn.net/dad3zz/article/details/50286283
http://sr16.com:8081/%E3%80%90bzoj1067%E3%80%91%E3%80%90scoi2007%E3%80%91%E9%99%8D%E9%9B%A8%E9%87%8F/

BZOJ1067降雨量相关推荐

  1. 思路与好题记录与小技巧

    记录好题,值得看看或再做一遍: p1306  SDOI2008,P1377仪仗队 BZOJ1067降雨量 想看的东西: https://ruanx.pw/post/%E7%89%9B%E9%A1%BF ...

  2. 备战NOIP每周写题记录(一)···不间断更新

    ※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...

  3. 【BZOJ1067】【SCOI2007】降雨量

    新人求助,降雨量那题,本机AC提交AC 原题: 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的 ...

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

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

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

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

  6. 通过卫星图像预测区域内降雨范围和降雨量

    来源:DeepHub IMBA本文约3000字,建议阅读5分钟 本文介绍了如何通过模型预测区域内降雨范围和降雨量. 介绍 在农业.自动驾驶.航空或能源领域,预测和了解天气是十分重要的.例如,天气条件对 ...

  7. [SCOI2007]降雨量

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

  8. 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1067 好不爽,弄了一个晚上. 好不爽. 还是照着别人程序拍着看的!!! 噗 这题很变态. 首先,我没 ...

  9. 1067. [SCOI2007]降雨量【线段树】

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

最新文章

  1. AI换脸鉴别率超99.6%,微软用技术应对虚假信息
  2. 老男孩老师的博客地址 - 转自devops1992
  3. VTK:PolyData之GetMiscCellData
  4. 微软推出了Cloud Native Application Bundles和开源ONNX Runtime
  5. (2014年3月1)Ubuntu 14.04 Beta 1-32位简体中文优化定制版
  6. 在缺乏贷后数据的情况下做好策略的调整把控
  7. 谷歌搜索363搜索引擎入口_SEO谷歌搜索引擎优化到底有啥好?
  8. JS 操作 HTML 和 AJAX 请求后台数据
  9. css关闭窗口按钮的代码,JS+CSS实现带关闭按钮DIV弹出窗口的方法
  10. 网站服务器、VPS和虚拟主机的联系与区别
  11. python变量循环写入txt文件_Python中将变量按行写入txt文本中
  12. matlab鲍威尔方法求函数,基于MATLAB的鲍威尔法求极值问题
  13. 射频下变频器在航空航天和国防领域的应用 ——扩展传统RF监控解决方案的实用方法
  14. 【转】BAT机器学习面试1000题系列
  15. “三次握手,四次挥手”你真的懂吗? 1
  16. javaScript深度克隆
  17. 基于容器的后端服务架构
  18. 数据分析课堂笔记Day2(20221114)
  19. Kotlin高仿微信-第26篇-朋友圈-选择图片、小视频对话框
  20. shader 雪 顶点位移_游戏雪天效果·积雪的厚度

热门文章

  1. 线程同步,互斥 事件 和关键代码的比较
  2. 想要不被裁,看一看 13 年华为老兵的宝贵经验
  3. 图案设计灵感怎么写_设计的灵感来源
  4. 突发奇想nico爬虫
  5. 程序员眼中最牛的UI设计师是怎样的?
  6. FMS与Vcam实现flv网络电视直播 FMS直播
  7. 创新商用沟通协作方式,科天云发布协作云开放平台
  8. leetcode阶段总结——拓扑排序
  9. 高中历史教师资格证考试成功通过前辈备考经验分享
  10. 微信小程序后台返回的JSON字符串转JSON报错问题解决方案