http://www.lydsy.com/JudgeOnline/problem.php?id=1067

题意:……

思路:首先我们开一个数组记录年份,一个记录降雨量,因为年份是按升序排列的,所以我们在每个询问找下标的时候可以二分搜索,然后对于每个询问我们是要寻找区间的最大值,因此我们可以使用ST表来做。比较麻烦的是判断三种答案的情况,做了一个下午。假设询问输入的是X和Y(X < Y)接下来分为四种情况:

1、X是已知,Y是已知。那么这是最容易想到的情况。

1-1、如果在[X+1,Y-1]区间中存在大于等于Y的降雨量,或者Y的降雨量大于X的降雨量,那么就输出false。

1-2、否则如果[X+1,Y-1]中存在未知年份,那么就输出maybe。

1-3、否则输出true。

2、X是已知,Y是未知。

2-1、如果在[X+1,Y]区间中存在大于等于X的降雨量,那么输出false。

2-2、否则输出maybe。

这里要注意如果X+1 > Y的情况,那么肯定是输出maybe的。要特判一下。(坑了好久)

3、X是未知,Y是已知。

3-1、如果在[X,Y-1]区间中存在大于等于Y的降雨量,那么输出false。

3-2、否则输出maybe。

4、X是未知,Y是未知。

4-1、直接输出maybe。

这里lower_bound()返回的是大于等于x的下标,upper_bound() - 1返回的是小于等于x的下标。

判断存在不存在就直接是二分后的下标和本身是不是相等的,而不用用到map这样的数据结构判断。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <iostream>
  6. using namespace std;
  7. #define N 50010
  8. #define INF 0x3f3f3f3f
  9.  
  10. int n, year[N], fall[N], dp[N][];
  11.  
  12. void RMQ_Init() {
  13. for(int i = ; i <= n; i++) dp[i][] = fall[i];
  14. int ed = (int)(log(n) / log(2.0));
  15. for(int j = ; j <= ed; j++)
  16. for(int i = ; i + ( << j) - <= n; i++)
  17. dp[i][j] = max(dp[i][j-], dp[i+(<<(j-))][j-]);
  18. }
  19.  
  20. int RMQ_Query(int l, int r) {
  21. if(l > r) return -INF; // !!!!!
  22. int ed = (int)(log(r - l + 1.0) / log(2.0));
  23. return max(dp[l][ed], dp[r-(<<ed)+][ed]);
  24. }
  25.  
  26. int main() {
  27. int q;
  28. while(~scanf("%d", &n)) {
  29. for(int i = ; i <= n; i++) scanf("%d%d", &year[i], &fall[i]);
  30. RMQ_Init();
  31. scanf("%d", &q);
  32. while(q--) {
  33. int l, r; scanf("%d%d", &l, &r);
  34. if(l > r) { puts("false"); continue; }
  35. int lid = lower_bound(year + , year + + n, l) - year;
  36. int rid = upper_bound(year + , year + + n, r) - year - ;
  37. int ans, res;
  38. if(year[lid] != l) {
  39. ans = RMQ_Query(lid, rid - );
  40. if(year[rid] != r) puts("maybe");
  41. else if(ans >= fall[rid]) puts("false");
  42. else puts("maybe");
  43. } else if(year[rid] != r) {
  44. ans = RMQ_Query(lid + , rid);
  45. if(ans >= fall[lid]) puts("false");
  46. else puts("maybe");
  47. } else {
  48. ans = RMQ_Query(lid + , rid - );
  49. if(fall[rid] <= ans || fall[lid] < fall[rid]) puts("false");
  50. else if(rid - lid != year[rid] - year[lid]) puts("maybe");
  51. else puts("true");
  52. }
  53. }
  54. }
  55. return ;
  56. }
  57.  
  58. /*
  59. 2
  60. 2000 4000
  61. 2005 4500
  62. 1
  63. 2005 2010
  64.  
  65. maybe
  66. */

BZOJ 1067:[SCOI2007]降雨量(RMQ+思维)的更多相关文章

  1. bzoj 1067: [SCOI2007]降雨量

    题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...

  2. bzoj 1067: [SCOI2007]降雨量 模擬

    1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2010  Solved: 503[Submit][Status] ...

  3. bzoj 1067: [SCOI2007]降雨量 (离散化+线段树)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1067 思路: 毒瘤题,写的自闭,改了一晚上,注意要理清题目的逻辑 x小于等于y,x,y之间的 ...

  4. 洛谷 2471 BZOJ 1067 [SCOI2007]降雨量

    [题解] 用线段树维护区间最大值(因为没有修改,St表也可以),然后由于x,y可能是降雨量未知的年份,需要进行分类讨论. #include<cstdio> #include<algo ...

  5. 1067: [SCOI2007]降雨量

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

  6. 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判

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

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

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

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

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

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

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

  10. 洛谷P2471 [SCOI2007] 降雨量 [RMQ,模拟]

    题目传送门 降雨量 题目背景 07四川省选 题目描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X ...

随机推荐

  1. 多线程——继承Thread类别

    详细java此前使用多线程,让我们来看看下面的问题. 什么是多线程     简单的理解成:cpu"同一时候"运行多个任务,这就是多线程. (究其本质,当涉及到进程和线程的概念.上面 ...

  2. PHP模拟POST提交数据并获得返回值之CURL方法(使用PHP extension,然后使用php_curl.dll,很不错)

    今天公司做个东西,需要条用同事的接口,我的代码和他的代码不在同一个域下,但是都是子域. a.ifensi.com与b.ifensi.com的关系. 我需要传递一个关联数组过去,他那边给我返回一个jso ...

  3. XF 标签和文本控件

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  4. MVC 身份验证和异常处理过滤器

    :在Global中注册为全局过滤器,应用于所有的Controller的Action 参数类均继承自ControllerContext,主要包含属性请求上下文.路由数据.结果 using FilterE ...

  5. ASP CRUD

    //UserInfoList.html <!DOCTYPE html> <html><head><meta http-equiv="Content- ...

  6. passed into methods by value java专题

    java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递.因为Primitive类型的值不能改变,所以method不能更改调用方传的primitive 值.因为method更改的是Primi ...

  7. 【全面解禁!真正的Expression Blend实战开发技巧】第七章 MVVM初体验-在DataGrid行末添加按钮

    原文:[全面解禁!真正的Expression Blend实战开发技巧]第七章 MVVM初体验-在DataGrid行末添加按钮 博客更新较慢,先向各位读者说声抱歉.这一节讲解的依然是开发中经常遇到的一种 ...

  8. 深入理解Amazon Alexa Skill(二)

    理解skill调用 本节来更详细的讨论alexa是如何确定调用哪个skill的. 参考:https://developer.amazon.com/zh/docs/custom-skills/under ...

  9. Linux下C语言RPC(远程过程调用)编程实例

    在查看libc6-dev软件包提供的工具(用 dpkg -L libc6-dev 命令)的时候,发现此软件包提供了一个有用的工具rpcgen命令.通过rpcgen的man手册看到此工具的作用是把RPC ...

  10. Win8Metro(C#)数字图像处理--2.19图像水平镜像

    原文:Win8Metro(C#)数字图像处理--2.19图像水平镜像  [函数名称] 图像水平镜像函数MirrorXProcess(WriteableBitmap src) [函数代码]      ...