[bzoj 1067 降雨量] [poj 2637 WorstWeather Ever] rmq+特判

5 篇文章 0 订阅
4 篇文章 0 订阅

bzoj题目传送门 poj题目传送门

题意

给出每年的降雨量,问X年是不是自Y年以来降雨量最多的年份(有些年份降雨量未给出)。
此题在bzoj和poj的唯一区别是poj上的数据是多组,其他没有什么区别。

题解

此题很明显用一个rmq+特判就能轻松秒掉。搞不懂为什么有人用线段树,用ST表就行啦。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int Maxn = 50005, INF = 0x7f7f7f7f;
int f[Maxn][20], Y[Maxn], R[Maxn], n, m;

void Make_St() {
	for (int i = 1; i <= n; ++i) f[i][0] = R[i];
	for (int j = 1; (1 << j) <= n; ++j)
	  for (int i = 1; i + (1 << j)  - 1 <= n; ++i)
		f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}


int rmq(const int &l, const int &r) {
	if (l > r) return -INF;
	int k = 0;
	while ((1 << (k + 1) <= r - l + 1)) ++k;
	return max(f[l][k], f[r -(1 << k) + 1 ][k]);
}

int main() {
	int i, t, l, r, a, b;
	while (scanf("%d", &n) != EOF) {
		for (i = 1; i <= n; ++i) scanf("%d%d", Y + i, R + i);
		scanf("%d", &m); Make_St();
		while (m--) {
			scanf("%d%d", &a, &b);
			l = lower_bound(Y + 1, Y + n + 1, a) - Y;
			r = lower_bound(Y + 1, Y + n + 1, b) - Y;
			if ((Y[l] != a) && (Y[r] != b)) puts("maybe");
			else if (Y[l] == a && Y[r] == b) {
				if (R[l] < R[r]) puts("false");
				else {
					t = rmq(l + 1, r - 1);
					if (t < R[r]) (r - l == b - a) ? puts("true") : puts("maybe");
					else puts("false");
				}
			} else if (Y[l] != a) (t = rmq(l, r - 1), t >= R[r]) ? puts("false") : puts("maybe");
			else (t = rmq(l + 1, r - 1), t >= R[l]) ? puts("false") : puts("maybe");
		}
		puts("");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值