True和False都好搞

Maybe的情况:

1.Y年和X年的降雨量已知,X年的降雨量不超过Y年的降雨量,从Y+1到X-1年中存在至少一年的降雨量未知,从Y+1到X-1年中已知的降雨量都小于X年的降雨量。

2.Y年和X年中有且仅有一年的降雨量未知,从Y+1到X-1年中已知的降雨量都小于X年的降雨量。

3.Y年和X年的降雨量都未知。 
以上三组条件中只要满足任意一组,答案即为”maybe”。

1.5h used

yyc太强辣

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<iostream>
using namespace std;
const int inf=0x373737;
map<int,int>dy;
map<int,int>dd;
int A[+],dmax[+][],n,cnt[+]; void RMQ_init(){
for(int i=;i<n;i++) dmax[i][]=dy[A[i]];
for(int j=;(<<j)<=n;j++){
for(int i=;i+(<<j)-<n;i++){
//dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
dmax[i][j]=max(dmax[i][j-],dmax[i+(<<(j-))][j-]);
}
}
} int rmq(int l,int r){
if(l==r) return dmax[l][];
int k=;
while((<<(k+))<=r-l+) k++;
return max(dmax[l][k],dmax[r-(<<k)+][k]);
} int main(){
while(~scanf("%d",&n)){
int t=;dy.clear();dd.clear();
memset(cnt,,sizeof(cnt));
for(int i=;i<n;i++){
int a,b;scanf("%d%d",&a,&b);
dd[a]=t;
A[t++]=a;
dy[a]=b;
}
RMQ_init();
int m;scanf("%d",&m);
while(m--){
int x,y;scanf("%d%d",&y,&x);
/*
if(x<y){
printf("false\n");
continue;
}
*/
int maxx;
if(dd.count(x)&&dd.count(y)) maxx=rmq(dd[y]+,dd[x]-);
if(dd.count(x)&&dd.count(y)){
if(dy[y]>=dy[x]&&(maxx<dy[x]||dd[x]-dd[y]==)){
if(x-y==dd[x]-dd[y]) printf("true\n");
else printf("maybe\n");
}
else printf("false\n");
}
else if(dd.count(x)||dd.count(y)){
if(dd.count(x)){
int p=lower_bound(A,A+n,y)-A;
//cout<<"pp="<<p<<endl;
int maxx=rmq(p,dd[x]-);
//cout<<"maxxx="<<maxx<<endl;
if(p==dd[x]||maxx<dy[x]) printf("maybe\n");
else printf("false\n");
}
else{
int p=lower_bound(A,A+n,x)-A;
//cout<<"p="<<p<<endl;
int maxx=rmq(dd[y]+,p-);
//cout<<"maxx"<<maxx<<endl;
if(dd[y]==p-||maxx<dy[y]) printf("maybe\n");
else printf("false\n");
}
}
else{
printf("maybe\n");
}
}
}
}
05-21 23:17