bzoj 1067: [SCOI2007]降雨量 模擬
1067: [SCOI2007]降雨量
Time Limit: 1 Sec Memory Limit: 162 MB
Submit: 2010 Solved: 503
[Submit][Status]
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
网上的标程没有一个靠谱的,关于询问超出了所给的年份边界,网上80%的程序都能倍hack掉。
这道题要注意的是题目卡了int,而且我自身对于lower_bound使用不熟悉。(lower_bound是前闭后开的)
题目解法就是分类讨论一下,就差不多了,思路简单,但是边界数据的坑很多。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<string>
#include<queue>
using namespace std;
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif
#define MAXN 51100
#define MAXV MAXN*2
#define MAXE MAXV*2
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
#define yes {printf("true\n");continue;}
#define no {printf("false\n");continue;}
#define maybe {printf("maybe\n");continue;}
typedef long long qword;
inline int nextInt()
{
char ch;
int x=;
bool flag=false;
do
ch=(char)getchar(),flag=(ch=='-')?true:flag;
while(ch<''||ch>'');
do x=x*+ch-'';
while (ch=(char)getchar(),ch<='' && ch>='');
return x*(flag?-:);
} int n,m;
struct aaa
{
int y,t;
}l[MAXN];
bool operator <(aaa a1,aaa a2)
{
return a1.y<a2.y;
}
int a[][MAXN],b[][MAXN];
void init_rmq()
{
int i,j;
for (i=;i<=n;i++)
{
a[][i]=l[i].t;
b[][i]=l[i].t;
}
for (j=;j<;j++)
{
for (i=;i+(<<j)-<=n;i++)
{
a[j][i]=min(a[j-][i],a[j-][i+(<<j>>)]);
b[j][i]=max(b[j-][i],b[j-][i+(<<j>>)]);
}
}
}
int ff[MAXN];
int get_max(int l,int r)
{
if (l>r)return -INF;
return max(b[ff[r-l]][l],b[ff[r-l]][r-(<<ff[r-l])+]);
}
int main()
{
freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int i,j,k;
int x,y,z;
scanf("%d",&n);
memset(ff,-,sizeof(ff));
for (i=;i<;i++)
if ((<<i)<=n)ff[(<<i)]=i;
ff[]=;
for (i=;i<=n;i++)
{
if (ff[i]==-)ff[i]=ff[i-];
}
for (i=;i<=n;i++)
{
scanf("%d%d",&l[i].y,&l[i].t);
if (i> && l[i].y<l[i-].y)
throw ;
}
l[].y=-INF;
scanf("%d",&m);
int d1,d2;
aaa t1,t2;
init_rmq();
for (i=;i<m;i++)
{
scanf("%d%d",&x,&y);
// if (x>y)no;
t1.y=x;
t2.y=y;
d1=lower_bound(l,l+n+,t1)-l;
d2=lower_bound(l,l+n+,t2)-l;
if (l[d2].y==y)//已知今年
{
if (l[d1].y==x)//已知開始年份
{
if (l[d1].t<l[d2].t)no;
if (get_max(d1+,d2-)>=l[d2].t)no;
if ((qword)d2-d1+==(qword)y-x+)yes;
maybe;//中間年份缺失
}else
{
d1--;
if (get_max(d1+,d2-)>=l[d2].t)no;
maybe;
}
}else
{
if (l[d1].y==x)
{
if (l[d1].t<=get_max(d1+,d2-))no;
maybe;
}else
{
maybe;
}
}
}
return ;
}
bzoj 1067: [SCOI2007]降雨量 模擬的更多相关文章
- bzoj 1067: [SCOI2007]降雨量
题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ...
- bzoj 1067: [SCOI2007]降雨量 (离散化+线段树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1067 思路: 毒瘤题,写的自闭,改了一晚上,注意要理清题目的逻辑 x小于等于y,x,y之间的 ...
- 洛谷 2471 BZOJ 1067 [SCOI2007]降雨量
[题解] 用线段树维护区间最大值(因为没有修改,St表也可以),然后由于x,y可能是降雨量未知的年份,需要进行分类讨论. #include<cstdio> #include<algo ...
- 1067: [SCOI2007]降雨量
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2148 Solved: 554[Submit][Status] ...
- 【BZOJ】1067: [SCOI2007]降雨量(rmq+变态题)
http://www.lydsy.com/JudgeOnline/problem.php?id=1067 好不爽,弄了一个晚上. 好不爽. 还是照着别人程序拍着看的!!! 噗 这题很变态. 首先,我没 ...
- 1067: [SCOI2007]降雨量 - BZOJ
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ...
- 1067. [SCOI2007]降雨量【线段树】
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003, ...
- BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4399 Solved: 1182 [Submit][Stat ...
- BZOJ 1067 & Interval_Tree
1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3099 Solved: 800 Description 我们常常 ...
随机推荐
- trace 日志
关闭 ORACLE trace 日志功能 alter system set trace_enabled=false select * from v$parameter where NAME lik ...
- chrome下老是弹出网页显示 true
事实上这个问题是chrome下安装了一些插件的原因,一般来说是安装迅雷插件会出现这个问题,删除迅雷插件就好了.
- [Angular 2] 8. Better ES5 Code
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 使用like时left outer join和inner join的区别
--select top 10000 * into #s from search set statistics time on set statistics io on select userId,c ...
- iOS 网络编程:socket
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- (转)C# NameValueCollection集合
1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCollectionBase 不同,该类在一个键下存储多个字符 ...
- SqlServer中的merge操作,相当地风骚
今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有洞天,原来是另外一个sql关键字,t-sql的语法 ...
- jQuery 事件 方法
jQuery 事件方法 事件方法触发器或添加一个函数到被选元素的事件处理程序. 下面的表格列出了所有用于处理事件的 jQuery 方法. 方法 描述 bind() 向元素添加事件处理程序 blur() ...
- 生产者与消费者(三)---BlockingQueue
前面阐述了实现生产者与消费者问题的两种方式:wait() / notify()方法 和 await() / signal()方法,本文继续阐述多线程的经典问题---生产者与消费者的第三种方式:Bloc ...
- 将数字n转换为字符串并保存到s中
将数字n转换为字符串并保存到s中 参考 C程序设计语言 #include <stdio.h> #include <string.h> //reverse函数: 倒置字符串s中各 ...