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. geoNear查询 near查询的升级版

    geoNear查询可以看作是near查询点进化版 geoNear查询使用runCommand命令进行使用,常用使用如下: db.runCommand({ geoNear:<collection& ...

  2. mongodb索引 全文索引

    全文索引,也叫文本索引,平时,我们百度的搜索,比如api文档的搜索,这种全局的索引就可以使用全文索引实现 全文索引:对字符串与字符串数组创建全文可搜索对索引 使用情况:比如有一个数据集合,存储了用户的 ...

  3. 【ML】聊天机器人

    继做过了泰语分词,自动对对对联后对聊天机器人产生了浓厚的兴趣.ChatBot集合了NLP,DL等多领域的应用. https://deeppavlov.ai/ https://www.rasa.com/ ...

  4. python_16_自己建立模块

    import python_5_password

  5. 将指定的form表单所有输入项转为json数据

    今天学习时,看到的将form表单中的输入数据转成json 的jquery代码,直接贴出来: $.fn.serializeJson=function(){ var serializeObj={}; va ...

  6. vue切换路由时动画

    安装个包 npm i nprogress 直接导入使用 最终的效果就是

  7. 牛客小白月赛5 G 异或(xor) 【找规律】

    题目链接: https://www.nowcoder.com/acm/contest/135/g 题目描述 从前,Apojacsleam家的水族箱里,养了一群热带鱼. 在这几条热带鱼里,Apojacs ...

  8. tomcat修改默认主页, 前段项目放到tomcat下,浏览器输入ip加端口后,直接到项目主页

    1,将 项目 放到 tomcat 的webapps 文件夹下 2, 修改conf 下的 server.xml , 找到 <Host name="localhost" appB ...

  9. Linux下重要日志及查看方式

    1.Linux下重要日志文件介绍 /var/log/boot.log 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息,如图1所示: 图1 /var/log/boot. ...

  10. vue系列之vue cli 3引入ts

    插件 Vue2.5+ Typescript 引入全面指南 vue-class-component强化 Vue 组件,使用 TypeScript/装饰器 增强 Vue 组件 vue-property-d ...