2022春每日一题:Day 21
题目:[SCOI2007]降雨量
这题比较坑,分几种情况,但是可以总起来说,分开写,两个月份都没出现,maybe,否则如果两个月份都大于[l+1,r-1]的最大值,如果两个月份差值=r-l输出,true,否则maybe,否则false
代码:
#include
#include
#include
#include
#include
#include
const int N = 5e4 + 5;
using namespace std;
int n, m, q, a[N], f[N][20], lg[N], e[N];
unordered_map mp;
int ask(int l, int r)
{
if(l > r)
return 0;
int j = lg[r - l + 1];
if(a[f[l][j]] > a[f[r - (1<>1] + 1;
for(int j = 1; (1<a[f[i + (1<< (j-1))][j-1]])
f[i][j] = f[i][j-1];
else
f[i][j] = f[i + (1<< (j-1))][j-1];
}
while(q--)
{
int l = 0, r = 0, x, y;
scanf("%d %d", &x, &y);
if(x>y)
{
puts("false");
continue;
}
if(mp.count(x))
l = mp[x];
if(mp.count(y))
r = mp[y];
if(l == 0 && r == 0)
{
puts("maybe");
continue;
}
if(l == 0)
{
l = upper_bound(e + 1, e + 1 + n, x) - e;
int kk = ask(l, r - 1);
if(a[r] > a[kk])
puts("maybe");
else
puts("false");
continue;
}
if(r == 0)
{
r = lower_bound(e + 1, e + 1 + n, y) - e - 1;
int kk = ask(l + 1, r);
if(a[l] > a[kk])
puts("maybe");
else
puts("false");
continue;
}
int kk = ask(l + 1, r - 1);
if(a[l] < a[r] || a[r] <= a[kk] || a[l] <= a[kk])
puts("false");
else if(r - l == y - x)
puts("true");
else
puts("maybe");
}
return 0;
}