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. PHP读取文件的常见方法

    整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件 ...

  2. BundleConfig的作用

    在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原 ...

  3. 函数定义和调用 -------JavaScript

    本文摘要:http://www.liaoxuefeng.com/ 定义函数 在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { ret ...

  4. React后台管理系统-rich-editor组件

    1.Simditor组件的github地址:https://github.com/mycolorway/simditor 网址:http://simditor.tower.im/ 2.在util里边新 ...

  5. 【Java】基本数据类型以及其转换

    整理了一下Java基本数据类型和面试可能涉及的知识.      字节数(byte)  位数(bit)  取值范围 整型  byte  1  8  -2^7 ~ 2^7 -1 short   2  16 ...

  6. java基础面试题:java中有没有goto? 在JAVA中如何跳出当前的多重嵌套循环?

    goto是Java的保留关键字,但是从来没有直接使用到goto,goto的跳转作用在Java中受到了限制,只有在特定场合下才能使用,如while for等循环中用continue.break或结合标签 ...

  7. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  8. jpeg解码库使用实例

    jpeg库下载地址: http://www.ijg.org/ 交叉编译三部曲: A ./configure --host=arm-linux-gcc --prefix=/home/flying/jpe ...

  9. 二十三、MySQL 事务

    MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数 ...

  10. LOL游戏基本代码

    class Hero: def __init__(self, new_nickname, new_aggressivity, new_life_value, new_money, new_armor ...