题目描述

我们常常会说这样的话:“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。

样例输入

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

样例输出

false
true
false
maybe
false


题解

倍增RMQ

分类讨论:

  1. 如果 $l$ 和 $r$ 都未知:显然答案为maybe。
  2. 如果 $l$ 未知而 $r$ 已知:如果 $[l+1,r-1]$ 中有大于等于 $r$ 的则答案为false;否则为maybe。
  3. 如果 $l$ 已知而 $r$ 未知:如果 $[l+1,r-1]$ 中有大于等于 $l$ 的则答案为false;否则为maybe。
  4. 如果 $l$ 和 $r$ 都已知:如果 $r$ 比 $l$ 大,或者 $[l+1,r-1]$ 中有大于等于 $r$ 的则答案为false;否则如果 $[l+1,r-1]$ 均给出则答案为true;否则为maybe。

具体使用二分查找寻找到在给出序列中的位置以及判断是否均给出,使用倍增RMQ求区间最大值。

时间复杂度 $O(n\log n)$ 。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 50010
  4. using namespace std;
  5. int n , a[N] , v[N] , mx[N][17] , log[N];
  6. inline int is_full(int l , int r)
  7. {
  8. int x = lower_bound(a + 1 , a + n + 1 , l) - a , y = upper_bound(a + 1 , a + n + 1 , r) - a - 1;
  9. return r - l == y - x;
  10. }
  11. inline int query(int l , int r)
  12. {
  13. int x = lower_bound(a + 1 , a + n + 1 , l) - a , y = upper_bound(a + 1 , a + n + 1 , r) - a - 1 , k;
  14. if(x > y) return 0;
  15. k = log[y - x + 1];
  16. return max(mx[x][k] , mx[y - (1 << k) + 1][k]);
  17. }
  18. int main()
  19. {
  20. int m , i , j , l , r , tl , tr , tm;
  21. scanf("%d" , &n);
  22. for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i] , &v[i]) , mx[i][0] = v[i];
  23. for(i = 2 ; i <= n ; i ++ ) log[i] = log[i >> 1] + 1;
  24. for(i = 1 ; i <= log[n] ; i ++ )
  25. for(j = 1 ; j <= n - (1 << i) + 1 ; j ++ )
  26. mx[j][i] = max(mx[j][i - 1] , mx[j + (1 << (i - 1))][i - 1]);
  27. scanf("%d" , &m);
  28. while(m -- )
  29. {
  30. scanf("%d%d" , &l , &r);
  31. tl = query(l , l) , tr = query(r , r);
  32. tm = query(l + 1 , r - 1);
  33. if(!tl && !tr) puts("maybe");
  34. else if(!tl)
  35. {
  36. if(tm >= tr) puts("false");
  37. else puts("maybe");
  38. }
  39. else if(!tr)
  40. {
  41. if(tm >= tl) puts("false");
  42. else puts("maybe");
  43. }
  44. else
  45. {
  46. if(tl < tr || tm >= tr) puts("false");
  47. else if(is_full(l + 1 , r - 1)) puts("true");
  48. else puts("maybe");
  49. }
  50. }
  51. return 0;
  52. }

【bzoj1067】[SCOI2007]降雨量 倍增RMQ的更多相关文章

  1. [BZOJ1067][SCOI2007]降雨量

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

  2. BZOJ1067 [SCOI2007]降雨量 RMQ???

    求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...

  3. 【线段树 细节题】bzoj1067: [SCOI2007]降雨量

    主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...

  4. 【BZOJ1067】[SCOI2007] 降雨量(RMQ+分类讨论)

    点此看题面 大致题意:请你判断"\(x\)年是自\(y\)年以来降雨量最多的"这句话的真假. 离散化/\(lower\_bound\) 首先,考虑到年份的范围非常大,便可以离散化. ...

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

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

  6. BZOJ1067 [SCOI2007]降雨量 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1067 题意概括 给定n组整数对(Xi,Yi),当Xi<Xj且Yi>=Yj时,如果对于任 ...

  7. BZOJ 1067:[SCOI2007]降雨量(RMQ+思维)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1067 题意:…… 思路:首先我们开一个数组记录年份,一个记录降雨量,因为年份是按升序排列的,所以我们 ...

  8. bzoj1067——SCOI2007降雨量(线段树,细节题)

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

  9. [bzoj1067][SCOI2007]降雨量——线段树+乱搞

    题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...

随机推荐

  1. .net core 使用windows版redis

    在项目中为了减少程序占用内存(将结果保存在全局变量里面,会占用内存),要求使用redis.开始了爬坑的过程.o(╥﹏╥)o c#操作redis 基本就这3中情况: ServiceStack.Redis ...

  2. Linux安装gitlab

    一.GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.安装方法是参考GitLab在GitHub上的Wiki页面. 二.我相信使用过git的开 ...

  3. dsp6657的helloworld例程测试-第二篇-CFG文件

    1. 上一篇疑问,int StackTest()这个函数是怎么运行的,后来在.cfg文件找到了答案,.cfg包含丰富的信息,对于用惯C语言的,确实不太习惯 var Memory = xdc.useMo ...

  4. autoreleasepool 自动释放池的理解

    常见的面试题:以下代码存在什么样的问题?应该如何改进? for (int i = 0; i < 100000; i++) { NSString *str = @"abc"; ...

  5. python环境通过selenium实现自动化web登陆及终端邀请

    自动化主要的就是识别对象,可以在网上搜到各种各样的方法,自行百度.下面仅附上一个简单的例子. 环境搭建参考如下链接: https://www.cnblogs.com/hepeilinnow/p/101 ...

  6. katalon系列十三:5.10新增跳过用例&命令行赋值全局变量

    Katalon Studio升级到5.10版本了,这次新增了2个很实用的功能:一.跳过用例在Listener中新增了跳过用例方法,Listener类似于JUnit4的annotation中的@Befo ...

  7. 使用GitLab创建项目

  8. windows下对python的pip更新到最新版本

    1->打开windows的命令窗口. 2->进入到pip.exe所在的文件夹下,我安装的python在G:\python3.6文件夹下,pip.exe则在G:\python3.6\Scri ...

  9. 自然语言处理 - 如何通俗地理解TFIDF?

    本博客属个人学习笔记,如有疏漏,欢迎在评论留言指出~转载请注明. 在自然语言处理中,TFIDF常常被人提及.很多材料都提及TFIDF中的“普遍重要性”,但很少有材料去简单解释其中的原理.TFIDF其实 ...

  10. windows8和windows server2012不联网安装.net 3.5(包括2.0和3.0)

    安装完win8后 发现系统默认没有安装.net3.5 如果使用在线更新的话需要很久才能完成,特别是当前的网速以及微软的服务器.速度很忙,其实我们利用win8的安装盘就可以不需要联网更新,而且几分钟就搞 ...