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. python_59_装饰器2

    #匿名函数,无函数名 calc=lambda x:x*3 print(calc(3)) sum=lambda x,y,z:x+y+z print(sum(1,2,3)) ''' 高阶函数 a:把一个函 ...

  2. 你所不知道的js的小知识点(1)

    1.js调试工具 debugger <div class="container"> <h3>debugger语句会产生一个断点,用于调试程序,并没有实际功能 ...

  3. 【Django】Django开发中的日志输出

    开发环境:Ubuntu16.04+Django 1.11.9+Python2.7 一:使用自定义函数输出日志到log文件: import time def print_log(log): file_o ...

  4. c#:无限极树形结构

    最近一直在研究树形结构菜单,无意中让我弄了出来.先上代码: 首先需要这个的一个类 public class Tree { public int id { get; set; } public stri ...

  5. 开源数据库中间件-MyCat

    开源数据库中间件-MyCat产生的背景 如今随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系型数据库已经无法满足快速查询与插入数据的需求.这 ...

  6. Serializer序列器

    定义Serializer 1. 定义方法 Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializ ...

  7. django之模型层

    1. ORM MVC或者MTV框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  8. HDU - 5017 Ellipsoid(模拟退火)

    题意 给一个三维椭球面,求球面上距离原点最近的点.输出这个距离. 题解 模拟退火. 把\(z = f(x, y)\)函数写出来,这样通过随机抖动\(x\)和\(y\)坐标就能求出\(z\). 代码 / ...

  9. Fibonacci again and again HDU - 1848

    任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1, ...

  10. (HTML)A标签伪元素选择器的继承关系

    ①如果a:link{}也存在,那么不管a{}放到哪里,a{}和a:link{}冲突的属性都会采用a:link{}的,不冲突的属性若存在a{}中,会被a:link{}. a:visited{} .a:h ...