【BZOJ1067】【POJ2637】降雨量
1067: [SCOI2007]降雨量
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 3004 Solved: 767
[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
Source
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define N 50000
using namespace std;
struct data{int mx,lx,rx,k;}seg[N*];
int n,m,lb,fb,hb,px,py,maxn,ct;
int know[N],a[N],rain[N];
void updata(int now)
{
seg[now].mx=max(seg[(now<<)].mx,seg[(now<<)+].mx);
seg[now].k=seg[(now<<)].k|seg[(now<<)+].k;
}
void buildtree(int now,int l,int r)
{
seg[now].lx=l; seg[now].rx=r;
if (l==r) {seg[now].mx=rain[l]; seg[now].k=know[l]; return;}
int mid=(l+r)>>;
buildtree((now<<),l,mid);
buildtree((now<<)+,mid+,r);
updata(now);
}
int query(int now,int begin,int end)
{
int l=seg[now].lx,r=seg[now].rx;
if (begin<=l && end>=r) {hb=hb|seg[now].k; return seg[now].mx;}
int mid=(l+r)>>,ans=;
if (begin<=mid) ans=max(query((now<<),begin,end),ans);
if (end>mid) ans=max(query((now<<)+,begin,end),ans);
return ans;
}
int main()
{
int i;
int x,y;
scanf("%d",&n);
for (i=;i<=n;i++)
{
scanf("%d%d",&a[i],&rain[i]);
if (a[i]-a[i-]!=&&i!=) know[i]=;
}
buildtree(,,n);
scanf("%d",&m);
for (i=;i<=m;i++)
{
fb=; hb=; lb=;
scanf("%d%d",&x,&y);
if (x>=y) {printf("false\n"); continue;}
if (y<=a[]||x>=a[n]) {printf("maybe\n");continue;}
px=lower_bound(a+,a+n+,x)-a; py=lower_bound(a+,a+n+,y)-a;
if (a[px]!=x) fb=; if (a[py]!=y) lb=;
if (fb&&lb) {printf("maybe\n");continue;}
if (!fb)
if (a[px+]-a[px]!=) hb=;
if (!lb)
if (a[py]-a[py-]!=) hb=;
if (fb&&lb) maxn=query(,px,py-);
else if (!fb&&lb) maxn=query(,px+,py-);
else if (fb&&!lb) maxn=query(,px,py-);
else if (!fb&&!lb) maxn=query(,px+,py-);
if (!fb&&!lb&&!hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("true\n");continue;}
if (!fb&&!lb&&hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("maybe\n");continue;}
if (!fb&&lb&&maxn<rain[px]) {printf("maybe\n"); continue;}
if (fb&&!lb&&maxn<rain[py]) {printf("maybe\n"); continue;}
printf("false\n");
}
return ;
}
BZOJ版
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define N 50000
using namespace std;
struct data{int mx,lx,rx,k;}seg[N*];
int n,m,lb,fb,hb,px,py,maxn,T;
int know[N],a[N],rain[N];
void updata(int now)
{
seg[now].mx=max(seg[(now<<)].mx,seg[(now<<)+].mx);
seg[now].k=seg[(now<<)].k|seg[(now<<)+].k;
}
void buildtree(int now,int l,int r)
{
seg[now].lx=l; seg[now].rx=r;
if (l==r) {seg[now].mx=rain[l]; seg[now].k=know[l]; return;}
int mid=(l+r)>>;
buildtree((now<<),l,mid);
buildtree((now<<)+,mid+,r);
updata(now);
}
int query(int now,int begin,int end)
{
int l=seg[now].lx,r=seg[now].rx;
if (begin<=l && end>=r) {hb=hb|seg[now].k; return seg[now].mx;}
int mid=(l+r)>>,ans=;
if (begin<=mid) ans=max(query((now<<),begin,end),ans);
if (end>mid) ans=max(query((now<<)+,begin,end),ans);
return ans;
}
int main()
{
int i;
int x,y;
while (~scanf("%d",&n))
{
if (n==) break;
memset(seg,,sizeof(seg));
memset(rain,,sizeof(rain));
memset(know,,sizeof(know));
memset(a,,sizeof(a));
for (i=;i<=n;i++)
{
scanf("%d%d",&a[i],&rain[i]);
if (a[i]-a[i-]!=&&i!=) know[i]=;
}
buildtree(,,n);
scanf("%d",&m);
for (i=;i<=m;i++)
{
fb=; hb=; lb=;
scanf("%d%d",&x,&y);
if (x>=y) {printf("false\n"); continue;}
if (y<=a[]||x>=a[n]) {printf("maybe\n");continue;}
px=lower_bound(a+,a+n+,x)-a; py=lower_bound(a+,a+n+,y)-a;
if (a[px]!=x) fb=; if (a[py]!=y) lb=;
if (fb&&lb) {printf("maybe\n");continue;}
if (!fb)
if (a[px+]-a[px]!=) hb=;
if (!lb)
if (a[py]-a[py-]!=) hb=;
if (fb&&lb) maxn=query(,px,py-);
else if (!fb&&lb) maxn=query(,px+,py-);
else if (fb&&!lb) maxn=query(,px,py-);
else if (!fb&&!lb) maxn=query(,px+,py-);
if (!fb&&!lb&&!hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("true\n");continue;}
if (!fb&&!lb&&hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("maybe\n");continue;}
if (!fb&&lb&&maxn<rain[px]) {printf("maybe\n"); continue;}
if (fb&&!lb&&maxn<rain[py]) {printf("maybe\n"); continue;}
printf("false\n");
}
printf("\n");
}
return ;
}
POJ版(多组数据)
【BZOJ1067】【POJ2637】降雨量的更多相关文章
- [BZOJ1067][SCOI2007]降雨量
[BZOJ1067][SCOI2007]降雨量 试题描述 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格 ...
- BZOJ1067 [SCOI2007]降雨量 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1067 题意概括 给定n组整数对(Xi,Yi),当Xi<Xj且Yi>=Yj时,如果对于任 ...
- 【线段树 细节题】bzoj1067: [SCOI2007]降雨量
主要还是细节分析:线段树作为工具 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小 ...
- BZOJ1067 [SCOI2007]降雨量 RMQ???
求救!!!神犇帮我瞅瞅呗...未完...调了2个半小时线段树,没调出来,大家帮帮我啊!!! 小詹用st表写. 我的思路就是把中间空着的年份设为无限,然后一点点特判就行了...然而没出来... [SCO ...
- bzoj1067——SCOI2007降雨量(线段树,细节题)
题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002 ...
- [bzoj1067][SCOI2007]降雨量——线段树+乱搞
题目大意 传送门 题解 我国古代有一句俗话. 骗分出奇迹,乱搞最神奇! 这句话在这道题上得到了鲜明的体现. 我的方法就是魔改版线段树,乱搞搞一下,首先借鉴了黄学长的建树方法,直接用一个节点维护年份的区 ...
- NOIP2018 - 暑期博客整理
暑假写的一些博客复习一遍.顺便再写一遍或者以现在的角度补充一点东西. 盛暑七月 初涉基环外向树dp&&bzoj1040: [ZJOI2008]骑士 比较经典的基环外向树dp.可以借鉴的 ...
- 【BZOJ1067】[SCOI2007]降雨量 RMQ+特判
[BZOJ1067][SCOI2007]降雨量 Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年 ...
- bzoj1067 降雨量&&vijos1265 暴风雨
描述 话说这日,李逍遥与阿奴正欲前往桃花源拿寿葫芦,突然电闪雷鸣,天降暴雨,弄得两人措手不及,只得到附近的树洞避雨. "哎,大理不是本应旱灾的吗?怎么会突降暴雨呢?"李逍遥嘀咕道. ...
随机推荐
- JavaScript前端框架的思考
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:现在JavaScript前端框架层出不穷,尤其Angular进入到2.x时候之后,我们 ...
- 关于Application Insights遥测功能使用【遇到问题】
简介:Application Insights是微软发布的一个在线服务,可以监测自己的网站应用,进行性能管理以及使用分析. Application Insights功能一开始是出现在Visualstu ...
- C++Primer快速浏览笔记-复合类型
C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象 ...
- AngularJS - 指令入门
指令,我将其理解为AngularJS操作HTML element的一种途径. 由于学习AngularJS的第一步就是写内置指令ng-app以指出该节点是应用的根节点,所以指令早已不陌生. 这篇日志简单 ...
- 【rqnoj378】 约会计划
题目描述 cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的调解各各妹妹间的关系.mm之间的关系及其复杂,cc必须严格 ...
- Android学习笔记(一)——安卓开发环境搭建
安装教程以及资源(2015.11.8最新版):链接:http://pan.baidu.com/s/1kTnOsMr 密码:0ogf
- 网上下载的CHM帮助文件打不开的解决办法。
我的机器 装的是 Windows server 2008 操作系统.他的安全性比较高. 我在网上下载了一个 CHM 帮助文档.结果打不开. 现象: 打开时 ,提示 安全警告, 提示:来自Interne ...
- hdu 2669 Romantic
Romantic Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- poj1745 dp
题目链接:http://poj.org/problem?id=1745 类似的题目之前写过一个差不多的(链接:http://www.cnblogs.com/a-clown/p/5982611.html ...
- DFS Codeforces Round #290 (Div. 2) B. Fox And Two Dots
题目传送门 /* DFS:每个点四处寻找,判断是否与前面的颜色相同,当走到已走过的表示成一个环 */ #include <cstdio> #include <iostream> ...