原题链接
看了很多博客都没搞清这个判断的东西
在AC后自认为我的判断算条理清晰的,于是发一下(然后感觉我这个蒟蒻的代码应该能让后生中的蒟蒻看懂吧 )
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 210000
struct node{
int l;
int r;
int MAX;
}n[maxn];
int year[maxn],rain[maxn];
void pushup(int cur)
{
n[cur].MAX=max(n[cur*2].MAX,n[cur*2+1].MAX);
}
void build(int cur,int l,int r)
{
n[cur].l=l,n[cur].r=r;
if(l==r)
{
n[cur].MAX=rain[l];
return;
}
int mid=(l+r)/2;
build(cur*2,l,mid);
build(cur*2+1,mid+1,r);
pushup(cur);
}
int query(int cur,int l,int r)
{
if(n[cur].l>r||n[cur].r<l)return 0;
int maxx=0;
if(n[cur].l>=l&&n[cur].r<=r)
{
return n[cur].MAX;
}
maxx=max(query(cur*2,l,r),maxx);
maxx=max(query(cur*2+1,l,r),maxx);
return maxx;
}
/*void dfs(int cur,int l,int r)
{
if(n[cur].l>r||n[cur].r<l)return;
cout<<year[n[cur].l]<<" "<<year[n[cur].r]<<" "<<n[cur].MAX<<endl;
int mid=(l+r)/2;
dfs(cur*2,l,r);
dfs(cur*2+1,mid+1,r);
}*/
int getans(int x,int y,int l,int r)
{//左边的是l和y,右边的是r和x
//“知道”的意思是在该下标对应的年份的降雨量是已知的
int flag;
//很多博客都判断了y>=x这种情况,但经过提交发现不用
//都不知道
if(year[l]!=y&&year[r]!=x)
{
flag=2;//maybe
}
//y不知道,x知道
else if(year[l]!=y&&year[r]==x)
{
if(query(1,l,r-1)<rain[r])//注意这种操作都不能包括右比较数,
//例如这个if不能写成if(query(1,l,r)==rain[r]),这样子无法判断严格小于的情况,下面几个同理
{
flag=2;//maybe
}
else flag=3;//false
}
//y知道,x不知道
else if(year[l]==y&&year[r]!=x)
{
if(query(1,l+1,r-1)<rain[l])
{
flag=2;//maybe
}
else flag=3;//false
}
//都知道
else
{
flag=3;//姑且先设为false
if(rain[l]!=rain[r]&&query(1,l+1,r-1)<rain[r]&&query(1,l+1,r)<rain[l])
{
flag=1;//姑且先设为true
if(year[r]-year[l]+1!=r-l+1)
{
flag=2;//不连续,设为maybe
}
}
}
return flag;
}
int main()
{
int N,M,r,l,y,x;
int flag;//1true 2maybe 3false
cin>>N;
for(int i=1;i<=N;i++)
{
cin>>year[i]>>rain[i];
}
build(1,1,N);
//建树是本题最简单的工作
//dfs(1,1,N);
cin>>M;
for(int i=1;i<=M;i++)
{
cin>>y>>x;
int l=lower_bound(year+1,year+N+1,y)-year;
int r=lower_bound(year+1,year+N+1,x)-year;//找到已知雨量的年份里>=y 和x 的年的对应下标
int flag=getans(x,y,l,r);
switch (flag)
{
case 1:cout<<"true";break;
case 2:cout<<"maybe";break;
case 3:cout<<"false";break;
}
cout<<endl;
}
}