【bzoj1067】[SCOI2007]降雨量 倍增RMQ

题目描述

我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。

输入

输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

输出

对于每一个询问,输出true,false或者maybe。

样例输入

6
2002 4920
2003 5901
2004 2832
2005 3890
2007 5609
2008 3024
5
2002 2005
2003 2005
2002 2007
2003 2007
2005 2008

样例输出

false
true
false
maybe
false



题解

倍增RMQ

分类讨论:

  1. 如果 $l$ 和 $r$ 都未知:显然答案为maybe。
  2. 如果 $l$ 未知而 $r$ 已知:如果 $[l+1,r-1]$ 中有大于等于 $r$ 的则答案为false;否则为maybe。
  3. 如果 $l$ 已知而 $r$ 未知:如果 $[l+1,r-1]$ 中有大于等于 $l$ 的则答案为false;否则为maybe。
  4. 如果 $l$ 和 $r$ 都已知:如果 $r$ 比 $l$ 大,或者 $[l+1,r-1]$ 中有大于等于 $r$ 的则答案为false;否则如果 $[l+1,r-1]$ 均给出则答案为true;否则为maybe。

具体使用二分查找寻找到在给出序列中的位置以及判断是否均给出,使用倍增RMQ求区间最大值。

时间复杂度 $O(n\log n)$ 。

#include <cstdio>
#include <algorithm>
#define N 50010
using namespace std;
int n , a[N] , v[N] , mx[N][17] , log[N];
inline int is_full(int l , int r)
{
	int x = lower_bound(a + 1 , a + n + 1 , l) - a , y = upper_bound(a + 1 , a + n + 1 , r) - a - 1;
	return r - l == y - x;
}
inline int query(int l , int r)
{
	int x = lower_bound(a + 1 , a + n + 1 , l) - a , y = upper_bound(a + 1 , a + n + 1 , r) - a - 1 , k;
	if(x > y) return 0;
	k = log[y - x + 1];
	return max(mx[x][k] , mx[y - (1 << k) + 1][k]);
}
int main()
{
	int m , i , j , l , r , tl , tr , tm;
	scanf("%d" , &n);
	for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i] , &v[i]) , mx[i][0] = v[i];
	for(i = 2 ; i <= n ; i ++ ) log[i] = log[i >> 1] + 1;
	for(i = 1 ; i <= log[n] ; i ++ )
		for(j = 1 ; j <= n - (1 << i) + 1 ; j ++ )
			mx[j][i] = max(mx[j][i - 1] , mx[j + (1 << (i - 1))][i - 1]);
	scanf("%d" , &m);
	while(m -- )
	{
		scanf("%d%d" , &l , &r);
		tl = query(l , l) , tr = query(r , r);
		tm = query(l + 1 , r - 1);
		if(!tl && !tr) puts("maybe");
		else if(!tl)
		{
			if(tm >= tr) puts("false");
			else puts("maybe");
		}
		else if(!tr)
		{
			if(tm >= tl) puts("false");
			else puts("maybe");
		}
		else
		{
			if(tl < tr || tm >= tr) puts("false");
			else if(is_full(l + 1 , r - 1)) puts("true");
			else puts("maybe");
		}
	}
	return 0;
}

原文地址:https://www.cnblogs.com/GXZlegend/p/8507456.html

时间: 2024-10-11 20:48:49

【bzoj1067】[SCOI2007]降雨量 倍增RMQ的相关文章

bzoj1067 scoi2007 降雨量 RMQ+讨论

很水的题目 滚回来之后的第一道题 竟然做了1个多小时 最近的状态极其不好,这样下去有可能省队都进不了... 这个题算是RMQ的基础题了 写他就是为了练习RMQ的 首先预处理出来区间Max 我们注意到10^9的区间显然太大了,但是其中有用的点非常少,所以我们要离散出来 当然题目中其实已经给你排好序了... 所以在st 表建好以后,就每次读入然后二分找对应的离散后的相应坐标,然后o(1)就可以完成询问 具体的情况比较多 不过都听好想的 如果wa了看代码吧 #include <iostream> #

BZOJ1067: [SCOI2007]降雨量

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4185  Solved: 1119[Submit][Status][Discuss] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“200

bzoj1067——SCOI2007降雨量(线段树,细节题)

题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说"2005年是自2003年以来最多的",但不能说"2005年是自2002年以来最多的"由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的. 输入输出格式 输入格式: 输

【SCOI2007】【BZOJ1067】降雨量

BZOJ首页讨论区hot的题目→_←终于A掉他了 1067: [SCOI2007]降雨量 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2340 Solved: 609 [Submit][Status][Discuss] Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的

1067: [SCOI2007]降雨量

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2148  Solved: 554[Submit][Status] Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以

BZOJ 1067 降雨量(RMQ+有毒的分类讨论)

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, 则可以说

【BZOJ 1067】 [SCOI2007]降雨量

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2211  Solved: 571 [Submit][Status] Description 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说&q

bzoj 1067: [SCOI2007]降雨量 模擬

1067: [SCOI2007]降雨量 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 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年以

【bzoj2006】[NOI2010]超级钢琴 倍增RMQ+STL-堆

题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该