bzoj1067降雨量

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[100000+10],dmax[100000+10][25],n,cnt[100000+10];
 
void RMQ_init(){
   for(int i=0;i<n;i++) dmax[i][0]=dy[A[i]];
   for(int j=1;(1<<j)<=n;j++){
     for(int i=0;i+(1<<j)-1<n;i++){
        //dmin[i][j]=min(dmin[i][j-1],dmin[i+(1<<(j-1))][j-1]);
        dmax[i][j]=max(dmax[i][j-1],dmax[i+(1<<(j-1))][j-1]);
     }
   }
}
 
int rmq(int l,int r){
   if(l==r) return dmax[l][0];
   int k=0;
   while((1<<(k+1))<=r-l+1) k++;
   return max(dmax[l][k],dmax[r-(1<<k)+1][k]);
}
 
int main(){
    while(~scanf("%d",&n)){
      int t=0;dy.clear();dd.clear();
      memset(cnt,0,sizeof(cnt));
      for(int i=0;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]+1,dd[x]-1);
         if(dd.count(x)&&dd.count(y)){
             if(dy[y]>=dy[x]&&(maxx<dy[x]||dd[x]-dd[y]==1)){
                  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]-1);
                //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]+1,p-1);
                //cout<<"maxx"<<maxx<<endl;
                if(dd[y]==p-1||maxx<dy[y]) printf("maybe\n");
                else printf("false\n");
             }
         }
         else{
            printf("maybe\n");
         }
      }
    }
}
View Code

 

posted @ 2017-11-16 23:21  探险家Mr.H  阅读(148)  评论(0编辑  收藏  举报