BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
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
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
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+有毒的分类讨论)的更多相关文章
- BZOJ 1067 降雨量
Description 我们常常会说这样的话:"\(X\)年是自\(Y\)年以来降雨量最多的".它的含义是\(X\)年的降雨量不超过\(Y\)年,且对于任意\(Y<Z< ...
- bzoj 1067: [SCOI2007]降雨量
题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...
- bzoj 1067: [SCOI2007]降雨量 模擬
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2010 Solved: 503[Submit][Status] ...
- 【BZOJ1067】[SCOI2007] 降雨量(RMQ+分类讨论)
点此看题面 大致题意:请你判断"\(x\)年是自\(y\)年以来降雨量最多的"这句话的真假. 离散化/\(lower\_bound\) 首先,考虑到年份的范围非常大,便可以离散化. ...
- bzoj 1067: [SCOI2007]降雨量 (离散化+线段树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1067 思路: 毒瘤题,写的自闭,改了一晚上,注意要理清题目的逻辑 x小于等于y,x,y之间的 ...
- BZOJ-1067 降雨量 线段树+分类讨论
这道B题,刚的不行,各种碎点及其容易忽略,受不鸟了直接 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2859 ...
- hdu 3183 A Magic Lamp RMQ ST 坐标最小值
hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...
- NYOJ 119 士兵杀敌(三) RMQ ST
NYOJ 119 士兵杀敌(三) RMQ ST 题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119 思路: ST在线 预处理O(nlog ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
随机推荐
- python_8_guess
#python3和2都可以 #方法1 age_of_oldboy=56 count=0 while True: if count==3: break guess_age=int(input('gues ...
- js数据结构处理--------树结构数据遍历
1.深度遍历 深度遍历利用栈来实现 class Stack { constructor () { this.top = 0, // 栈的长度 this.list = [] } push(item) { ...
- Bootstrap历练实例:响应式导航(带有表单)
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- MySQL优化器功能开关optimizer_switch
MySQL 8.0新增特性 use_invisible_indexes:是否使用不可见索引,MySQL 8.0新增可以创建invisible索引,这一开关控制优化器是否使用invisible索引,on ...
- tomcat服务器用Servlet类查找磁盘文件上的Json信息,如果匹配则在浏览器上显示出该条内容的全部信息
package com.swift; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOE ...
- es6中的类及es5类的实现
目录 类的特点 类的特点 1.类只能通过new得到 在es6中类的使用只能是通过new,如果你将它作为一个函数执行,将会报错. //es6的写法 class Child { constructor() ...
- 十、MySQL 删除数据表
MySQL 删除数据表 MySQL中删除数据表是非常容易操作的, 但是你再进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失. 语法 以下为删除MySQL数据表的通用语法: DROP TA ...
- 嵌入式开发 centos7 交叉编译环境准备
1. 安装centos7,启动图像化界面. 参考:https://blog.csdn.net/qq_23014435/article/details/74347925 # systemctl get- ...
- 揭密 Vue 的双向绑定
Vue 中需要输入什么内容的时候,自然会想到使用 <input v-model="xxx" /> 的方式来实现双向绑定.下面是一个最简单的示例 剖析Vue原理& ...
- oracle 11gR2 for win7旗舰版64安装以及连接plsql和NaviCat(win64_11gR2_database) (2012-12-31-bd 写的日志迁移
先到oracle官网http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html下载必要数 ...