BZOJ 1067 降雨量
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\)行每行两个整数\(y_{i}\)和\(r_{i}\),为年份和降雨量,按照年份从小到大排列,即\(y_{i}<y_{i}+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 \le n \le 50000, 1 \le m \le 10000, -10^{9} \le y_{i} \le 10^{9}, 1 \le r_{i} \le 10^{9}\)
线段树或rmq都可以做啊。
#include<cstdio>
#include<cstdlib>
using namespace std;
#define inf (1<<30)
#define maxn (50010)
#define maxm (10010)
int n,m;
struct node
{
	int a,b;
	inline void read() { scanf("%d %d",&a,&b); }
	friend inline bool operator >(const node &x,const node &y) { return x.b != y.b?x.b>y.b:x.a<y.a; }
	friend inline bool operator != (const node &x,const node &y) { return x.a!=y.a||x.b!=y.b; }
}rain[maxn],seg[maxn*4];
inline node Max(const node &x,const node &y) { if (x > y) return x; return y; }
inline int find(int key)
{
	int l = 1,r = n;
	while (l <= r)
	{
		int mid = (l + r) >> 1;
		if (rain[mid].a <= key) l = mid + 1;
		else r = mid - 1;
	}
	return l;
}
inline void build(int l,int r,int now)
{
	if (l == r) { seg[now] = rain[l]; return; }
	int mid = (l + r) >> 1;
	build(l,mid,now<<1); build(mid+1,r,now<<1|1);
	seg[now] = Max(seg[now<<1],seg[now<<1|1]);
}
inline node ask(int l,int r,int now,int ql,int qr)
{
	if (ql > qr) return (node){-inf,-inf};
	if (l >= ql&&r <= qr) return seg[now];
	int mid = (l + r) >> 1;
	if (qr <= mid) return ask(l,mid,now<<1,ql,qr);
	else if (ql > mid) return ask(mid+1,r,now<<1|1,ql,qr);
	else return Max(ask(l,mid,now<<1,ql,mid),ask(mid+1,r,now<<1|1,mid+1,qr));
}
int main()
{
	freopen("1067.in","r",stdin);
	freopen("1067.out","w",stdout);
	scanf("%d",&n);
	for (int i = 1;i <= n;++i) rain[i].read();
	rain[0].a = -inf;
	build(1,n,1);
	scanf("%d",&m);
	for (int i = 1;i <= m;++i)
	{
		int x,y; scanf("%d %d",&x,&y);
		int l = find(x)-1,r = find(y)-1;
		if (rain[l].a != x&&rain[r].a != y) printf("maybe\n");
		else if (rain[l].a == x && rain[r].a == y)
		{
			if (ask(1,n,1,l,r-1) != rain[l]||ask(1,n,1,l+1,r) != rain[r]) printf("false\n");
			else
			{
				if (rain[l].b < rain[r].b) printf("false\n");
				else
				{
					if (r-l+1 == y-x+1) printf("true\n");
					else printf("maybe\n");
				}
			}
		}
		else
		{
			if (rain[l].a == x)
			{
				if (ask(1,n,1,l,r) != rain[l]||ask(1,n,1,l+1,r).b == rain[l].b) printf("false\n");
				else printf("maybe\n");
			}
			else
			{
				if (ask(1,n,1,l+1,r) != rain[r]) printf("false\n");
				else printf("maybe\n");
			}
		}
	}
	fclose(stdin); fclose(stdout);
	return 0;
}
BZOJ 1067 降雨量的更多相关文章
- BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
		1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 4399 Solved: 1182 [Submit][Stat ... 
- bzoj 1067: [SCOI2007]降雨量
		题目链接: bzoj 1067: [SCOI2007]降雨量 题解: 很简单的一道题,但代码里有许多细节需要注意,切容易出错,调了三个小时OTZ 做一个st表维护区间最大值就 在获得年份在序列中的po ... 
- bzoj 1067: [SCOI2007]降雨量 模擬
		1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2010 Solved: 503[Submit][Status] ... 
- BZOJ 1067:[SCOI2007]降雨量(RMQ+思维)
		http://www.lydsy.com/JudgeOnline/problem.php?id=1067 题意:…… 思路:首先我们开一个数组记录年份,一个记录降雨量,因为年份是按升序排列的,所以我们 ... 
- 【BZOJ 1067】 [SCOI2007]降雨量
		Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2 ... 
- bzoj 1067: [SCOI2007]降雨量 (离散化+线段树)
		链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1067 思路: 毒瘤题,写的自闭,改了一晚上,注意要理清题目的逻辑 x小于等于y,x,y之间的 ... 
- 降雨量 BZOJ 1067
		降雨量 [问题描述] 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,20 ... 
- 洛谷 2471 BZOJ 1067 [SCOI2007]降雨量
		[题解] 用线段树维护区间最大值(因为没有修改,St表也可以),然后由于x,y可能是降雨量未知的年份,需要进行分类讨论. #include<cstdio> #include<algo ... 
- BZOJ 1067 & Interval_Tree
		1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3099 Solved: 800 Description 我们常常 ... 
随机推荐
- 在ASP.NET中,IE与Firefox下载文件带汉字名时乱码的解决方法
			解决办法: HttpContext.Current.Response.Clear(); HttpContext.Current.Response.Buffer = true; HttpContext. ... 
- SpringMVC ModelAndView方法与模板传参接收不到问题
			最近在使用Spring MVC做项目时,碰到一个问题,就是通过ModelAndView与前端模板页面通信时,一直无法在模板中显示出来传过去的参数值. 在网上也查了好久,就是不知道是啥问题,很是郁闷. ... 
- javascript中的稀疏数组(sparse array)和密集数组
			学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ... 
- 通过WriteProcessMemory改写进程的内存
			http://www.cnblogs.com/feiyucq/archive/2009/10/21/1587628.html 以PROCESS_ALL_ACCESS权限打开进程以后既能够使用ReadP ... 
- ural 1018 Binary Apple Tree(树形dp | 经典)
			本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ... 
- [Javascript] An Introduction to JSPM (JavaScript Package Manager)
			JSPM can handle installed packages, transpiling ES6, and bundling all from the command-line. This vi ... 
- Qtcreator中经常使用快捷键总结
			Qtcreator中经常使用快捷键总结 F1 查看帮助 F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果) Shift+F2 声明和定义之间切换 F4 ... 
- good  page
			http://www.cnblogs.com/zrtqsk/category/540486.html 
- /proc/sysrq-trigger
			立即重启计算机 echo "b" > /proc/sysrq-trigger 立即关闭计算机 echo "o" > /proc/ ... 
- UVa 993: Product of digits
			这道题很简单.先将N用2,3,5,7(即10以内的素数)分解因数(需要先特殊判断N不为1),然后将可以合并的因数合并(如2*2合并成4,)这样求得的结果位数会减少,大小肯定会小一些.具体实现见代码. ... 
