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;
else
R = 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;
}
else
L = 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;
}
else
R = 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<=Fy
puts("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");
else
puts("false");
}
}
else//中间年份残缺
{
if (L + 1 > R - 1) //输入顺序相邻
puts("maybe");
else//至少隔了一个输入单位
{
int ma = ST(L + 1, R - 1);
if (ma < arr[R].val)
puts("maybe");
else
puts("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");
else
puts("false");
}
else
{
int ma = ST(L + 1, R);
if (ma < arr[L].val)
puts("maybe");
else
puts("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");
else
puts("false");
}
}
else//均未知,一定是maybe
puts("maybe");
}
}
return 0;
}

BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)的更多相关文章

  1. BZOJ 1067 降雨量

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

  2. bzoj 1067: [SCOI2007]降雨量

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

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

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

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

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

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

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

  6. BZOJ-1067 降雨量 线段树+分类讨论

    这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...

  7. hdu 3183 A Magic Lamp RMQ ST 坐标最小值

    hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...

  8. NYOJ 119 士兵杀敌(三) RMQ ST

    NYOJ 119 士兵杀敌(三) RMQ ST 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119 思路: ST在线 预处理O(nlog ...

  9. lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增

    https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...

随机推荐

  1. java打包打包

    http://blog.sina.com.cn/s/blog_6b9dcc870101k8xq.html 上面说的最后一种方法,不太对. 下面这个可以 Try the fat-jar extensio ...

  2. Oracle ORA-01722 无效数字

    ORA-01722 无效数字 以下几种情况,数据库会报“ORA-01722 无效数字”错误: ① 对于两个类型不一致,一个“数字类型”,一个“非数字类型”进行赋值,或者比较操作: ② to_numbe ...

  3. Vue中结合clipboard实现复制功能

    首先现在Vue中引入clipboard npm install clipboard --save 在需要使用的组件中import 引入clipboard import Clipboard from ' ...

  4. Dart Socket 与Java Socket连接

    -------------------------------------------------------------  Dart    SocketClient----------------- ...

  5. MultipartFile 动态决定是否上传文件,解决不上传文件报错

    controller 接收参数   用 HttpServletRequest 代替 @RequestParam()  接收参数 picFile 前台 传文件的参数名字  ,   这样 前段 传 nul ...

  6. 用jq给img添加error事件

    <img src="xxxx.jpg" alt="" /> <script> $(document).ready(function(){ ...

  7. 【Mysql】mysql中bigint、int、mediumint、smallint 和 tinyint的取值范围

    1.bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字),无符号的范围是0到 1844674 ...

  8. L1-039 古风排版 (20 分)

    L1-039 古风排版 (20 分)   中国的古人写文字,是从右向左竖向排版的.本题就请你编写程序,把一段文字按古风排版. 输入格式: 输入在第一行给出一个正整数N(<),是每一列的字符数.第 ...

  9. Leetcode 106. 从中序与后序遍历序列构造二叉树

    题目链接 https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/descri ...

  10. js 监听后退事件及跳转页面

    //直接跳转 window.location.href="b.html"; //返回上一级页面 window.history.back(-1); //返回下一级页面 window. ...