现在的位置: 首页 > 综合 > 正文

【bzoj1067】降雨量

2018年04月25日 ⁄ 综合 ⁄ 共 2103字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
using namespace std;
struct data{int ly,ry,mx,know;}tr[200001];
int n,m;
void build(int k,int l,int r)
{
     if(l==r){scanf("%d%d",&tr[k].ly,&tr[k].mx);tr[k].ry=tr[k].ly;tr[k].know=1;return;}
     int mid=(l+r)>>1;
     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
     tr[k].know=(tr[k<<1].know&&tr[k<<1|1].know);
     if(tr[k<<1].ry+1!=tr[k<<1|1].ly)tr[k].know=0;
     tr[k].ly=tr[k<<1].ly;tr[k].ry=tr[k<<1|1].ry;
     tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);
 }
int get(int k,int x)
{    
    if(tr[k].ly==tr[k].ry)
    {
        if(tr[k].ly!=x)return 0;                
        else return tr[k].mx;
                        }
    if(x<=tr[k<<1].ry)return get(k<<1,x);
    else if(x>=tr[k<<1|1].ly)return get(k<<1|1,x);
    return 0;
}
int ask(int k,int x,int y,int num)
{
    bool f=0;
    if(x<tr[k].ly){f=1;x=tr[k].ly;}
    if(tr[k].ly==x&&tr[k].ry==y)
    {
                  if(tr[k].mx>=num)return 0;
                  else if(tr[k].know&&!f)return 1;
                  else return 2;
                  }
    if(y<=tr[k<<1].ry)
    {         
         return ask(k<<1,x,y,num);
     }
    else if(x>=tr[k<<1|1].ly)
    {
         return ask(k<<1|1,x,y,num);
     }
    else
    {
         int t1=ask(k<<1,x,tr[k<<1].ry,num);
         int t2=ask(k<<1|1,tr[k<<1|1].ly,y,num);
         if(!t1||!t2)return 0;
         else if(tr[k<<1].ry+1!=tr[k<<1|1].ly)return 2;
         else return 1;
     } 
}
int getnext(int k,int x)
{
    int l=tr[k].ly,r=tr[k].ry;
    if(l==r)return tr[k].ly;
    if(x<tr[k<<1].ry)return getnext(k<<1,x);
    else return getnext(k<<1|1,x);
}
int getlast(int k,int x)
{
    int l=tr[k].ly,r=tr[k].ry;
    if(l==r)return tr[k].ly;
    if(x>tr[k<<1|1].ly)return getlast(k<<1|1,x);
    else return getlast(k<<1,x);
} 
int main()
{
    scanf("%d",&n);
    build(1,1,n);
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
            int l,r;
            scanf("%d%d",&l,&r);
            if(r<l){printf("false\n");continue;}
            int lnum=get(1,l),rnum=get(1,r);
            if(!lnum&&!rnum)printf("maybe\n");
            else
            {
            int s=getnext(1,l),t=getlast(1,r);
            if(!lnum)
            {
                if(s>t||r==t){printf("maybe\n");continue;}
                   int f=ask(1,s,t,rnum);
                if(f==0)printf("false\n");
                else printf("maybe\n");
            }
            else if(!rnum)
            {
                if(s>t||l==s){printf("maybe\n");continue;}
                   int f=ask(1,s,t,lnum);
                if(f==0)printf("false\n");
                else printf("maybe\n");
            }
            else
            {
                if(rnum>lnum){printf("false\n");continue;}
                if(s>t){
                     if(l+1==r) printf("true\n");
                     else printf("maybe\n");
                     continue;
                     }
                int f=ask(1,s,t,rnum);
                if(f==0)printf("false\n");
                else if(f==1)
                {
                       if(l+1==s&&r-1==t)printf("true\n");
                       else printf("maybe\n");
                   }
                else if(ask(1,s,t,rnum)==2)printf("maybe\n");
                else printf("false\n");
            }
        }
    }
    return 0;
}

抱歉!评论已关闭.