1067: [SCOI2007]降雨量

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4399  Solved: 1182
[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

题目链接:BZOJ 1067

这题的分类讨论简直要死,WA很多次才过了,先用RMQ处理出一段区间内的降雨量最大值,然后由于不仔细审题,以为只要y+1~x-1这一段区间内的降雨量严格小于x即可,实际上除了这个条件还需要x的降雨量小于等于y的降雨量:它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年然后分类讨论区间是否合法,我写的辣鸡代码量比较多,但是感觉比较清楚

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 50010;
struct info
{int year;int val;
};
info arr[N];
int maxm[N << 1][20];
map<int, int>vis;void RMQ_init(int l, int r)
{int i, j;for (i = l; i <= r; ++i)maxm[i][0] = arr[i].val;for (j = 1; l + (1 << j) - 1 <= r; ++j)for (i = l; i + (1 << j) - 1 <= r; ++i)maxm[i][j] = max(maxm[i][j - 1], maxm[i + (1 << (j - 1))][j - 1]);
}
int ST(int l, int r)
{int k = log2(r - l + 1);return max(maxm[l][k], maxm[r - (1 << k) + 1][k]);
}
int Find(int year, int l, int r)
{int L = l, R = r, ans = 0;while (L <= R){int mid = (L + R) >> 1;if (arr[mid].year == year){ans = mid;break;}else if (arr[mid].year < year)L = mid + 1;elseR = mid - 1;}return ans;
}
int Find_Lpos(int year, int l, int r)//相当于lower_bound
{int L = l, R = r, ans = 0;while (L <= R){int mid = (L + R) >> 1;if (arr[mid].year >= year){ans = mid;R = mid - 1;}elseL = mid + 1;}return ans;
}
int Find_Rpos(int year, int l, int r)//相当于upper_bound - 1
{int L = l, R = r, ans = 0;while (L <= R){int mid = (L + R) >> 1;if (arr[mid].year <= year){ans = mid;L = mid + 1;}elseR = mid - 1;}return ans;
}
int main(void)
{int n, m, i, x, y;while (~scanf("%d", &n)){vis.clear();for (i = 1; i <= n; ++i){scanf("%d%d", &arr[i].year, &arr[i].val);vis[arr[i].year] = arr[i].val;}RMQ_init(1, n);scanf("%d", &m);for (i = 0; i < m; ++i){scanf("%d%d", &y, &x);if (vis[y] && vis[x]){int L = Find(y, 1, n);int R = Find(x, 1, n);if (arr[R].val > arr[L].val) //保证Fx<=Fyputs("false");else if (R - L + 1 == x - y + 1) //中间年份全{if (L + 1 > R - 1) //年份相邻puts("true");else//至少隔了一个单位{int ma = ST(L + 1, R - 1);if (ma < arr[R].val)puts("true");elseputs("false");}}else//中间年份残缺{if (L + 1 > R - 1) //输入顺序相邻puts("maybe");else//至少隔了一个输入单位{int ma = ST(L + 1, R - 1);if (ma < arr[R].val)puts("maybe");elseputs("false");}}}else if (vis[y] && !vis[x]) //y已知x未知{int L = Find(y, 1, n);int R = Find_Rpos(x, 1, n);if (L == R)puts("maybe");else if (L == R - 1){if (arr[R].val < arr[L].val)puts("maybe");elseputs("false");}else{int ma = ST(L + 1, R);if (ma < arr[L].val)puts("maybe");elseputs("false");}}else if (!vis[y] && vis[x]) //y未知x已知{int L = Find_Lpos(y, 1, n);int R = Find(x, 1, n);if (L == R)puts("maybe");else{int ma = ST(L, R - 1);if (ma < arr[R].val)puts("maybe");elseputs("false");}}else//均未知,一定是maybeputs("maybe");}}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/6354251.html

BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)相关推荐

  1. CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init、ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录

    CV之IC之SpatialTransformer:基于ClutteredMNIST手写数字图片数据集分别利用CNN_Init.ST_CNN算法(CNN+ST)实现多分类预测案例训练过程记录 目录 基于 ...

  2. 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)

    目录 P3379 [模板]最近公共祖先(LCA) 暴力 倍增法 RMQ+ST Tarjan 四个方法的优缺点比较 P3379 [模板]最近公共祖先(LCA) 暴力 操作步骤: 求出每个结点的深度: 询 ...

  3. 【BJOI2019】送别(平衡树)(大力分类讨论)

    传送门 首先,我不知道为什么有这么多人在喷出题人,我觉得这道题作为防AK题就只有"部分分过少",或者说"部分分写法过于繁杂"这一个问题吧,而且出题人也在知乎上面 ...

  4. 分类讨论 ---- 2020 icpc 上海 Walker (二分 or 思维分类讨论)

    题目链接 题目大意: 就是两个人在坐标轴上面,有起始的坐标p1,p2p1,p2p1,p2,和速度v1,v2v1,v2v1,v2,问你访问完这长度为nnn的数轴最短时间是多少? 解题思路: 大佬有直接二 ...

  5. CF1471 D - Strange Definition(思维,分类讨论,lcm,gcd的性质,数论)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #694 (Div. 2) D 很好的一道数论思维题 D - Str ...

  6. Unfair contest 模拟-分类讨论

    题意 : 两人比赛,n个裁判,给分范围[1,h][1, h][1,h],去掉s个最高分和t个最低分,给出n - 1个裁判的给分,第n个裁判想让第1个人赢,并且最小化给1的分数a[n]a[n]a[n] ...

  7. 2020ICPC(上海) - Walker(分类讨论+二分)

    题目链接:点击查看 题目大意:在长度为 n 的数轴上给出两个人的初始位置和速度,问使得每个位置至少被一个人走过的时间是多少 题目分析:分类讨论题目,分四种情况讨论即可,设 p1 < p2: p1 ...

  8. 【UOJ#33】【UR #2】树上GCD(长链剖分/根号分类讨论)

    [UOJ#33][UR #2]树上GCD 求解树上两个点到lca的距离的最大公约数是k的对数 首先我们很容易就想到莫比乌斯反演,那么利用倍数形式,我们只需要求解是i的倍数的对数. 考虑枚举lca,这个 ...

  9. uoj#246. 【UER #7】套路(dp+分块?分类讨论?)

    题目链接 分析: 目前为止我只能理解dp部分 我就喜欢这种单纯不做作的题目 一看名字就明白了这道题的本质 中二的题目描述 很显然,我们的关键就是求出最小相似度 朴素算法n^4 如果我们现在有一个权值数 ...

  10. Vasya and Multisets CodeForces - 1051C 模拟|分类讨论

    题意:把数组分成两个集合 每个集合中元素数量为1的个数相同(此个数可以是0) 分析: 这类问题就是要各种可能情况考虑到     然后分类讨论     完整地正确分类就AC     否则gg 如果数量为 ...

最新文章

  1. signature=4abdf782f13579fc1b57d94a0c6ce95c,β-lactam-associated eosinophilic colitis
  2. linux下安装Oracle10g时,安装rpm文件的技巧 (rpm -Uvh package名)
  3. AutoIt: WinGetClassList可以把当前窗口所有的handle全部列出来
  4. xml 属性value换行显示_跟光磊学Java开发-Java解析XML
  5. php使用mysqlnd引发的一些问题处理
  6. Java常用接口与类——Date、Calendar、DateFormat、TimeZone(日期相关)
  7. no cortex-m sw device found_SW大模块水箱桂林厂家图纸
  8. java根据field名获取变量_Java反射有多强?这5大神奇功能,你需要了解!
  9. 【转】Java重构-策略模式、状态模式、卫语句
  10. php把字符串日期转成时间戳,php怎样把日期转成时间戳
  11. 公司员工考勤系统Java代码
  12. java使用poi读写word中的图片(二)
  13. 快速检索2021年EI会议论文的方法
  14. char类型数据说明
  15. idea中文件提交不了svn怎么办
  16. IO流 | IO流的应用举例
  17. 编译原理实验 -- 文法分析
  18. cmd导入sql数据
  19. windows 10 电脑 应用图标变白色恢复方法
  20. 蘑菇街收购锐鲨科技,志在押注国货新浪潮?

热门文章

  1. SpringBoot2.0.0启动流程
  2. 操作系统 第一部分 操作系统的基本概念
  3. html语言考点,HTML知识点
  4. Pytorch和Torchvision版本对应
  5. Ubuntu/Linux下7款轻量级编辑器推荐
  6. Keras中的时间分布层TimeDistributed Layer使用教程
  7. 解决sklearn库使用过程中No module named model_selection的错误
  8. python插排_PythonTkinter接收插座不接收
  9. ❤️Python Django网站开发 2021年最新版教程 合集❤️
  10. 区块链入门教程openzeppelin库详解