题意
给出每年的降雨量,问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;
}