[bzoj1067][SCOI2007]降雨量

呕......这道题直接把我的提交页面刷屏了,一页的红色

#include<iostream>
#include<cstdio>
#define N 65536
using namespace std;
inline int read()
{
    int  x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int n,m;
struct YEAR{int num,r;}s[N];
int T[N*2+5];

int query(int l,int r)
{
//    cout<<"query"<<l<<" "<<r<<" ";
    if(l>r)return 0;
    int sum=0;
    for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1)
    {
        if(~l&1)sum=max(sum,T[l+1]);
        if( r&1)sum=max(sum,T[r-1]);
    }
    //cout<<sum<<endl;
    return sum;
}

int find(int x)
{
    int l=1,r=n,mid=(l+r)>>1,ans=0;;
    for(;l<=r;mid=(l+r)>>1)
    {
        if(s[mid].num>=x) ans=mid,r=mid-1;
        else l=mid+1;
    }
//    cout<<"find"<<x<<" "<<s[ans].num<<endl;
    return ans;
}

int main()
{
    n=read();
    for(int i=1;i<=n;i++)
    {s[i].num=read();T[i+N]=s[i].r=read();}s[++n].num=2000000000;
    m=read();for(int i=N;i;i--)T[i]=max(T[i<<1],T[i<<1|1]);
    for(int i=1;i<=m;i++)
    {
        int y=read(),x=read(),xx=find(x),yy=find(y),ans;xx-=(s[xx].num!=x);
        if(xx<yy)puts("maybe");
        else 
        {
            ans=query(yy+(s[yy].num==y),xx-(s[xx].num==x));
            if(s[yy].num==y&&s[yy].r<=ans) puts("false");
            else if(s[xx].num==x&&s[xx].r<=ans) puts("false");
            else if(s[yy].num==y&&s[xx].num==x&&s[xx].r>s[yy].r) puts("false");
            else if(x-y==xx-yy&&s[xx].num==x&&s[yy].num==y) puts("true");
            else puts("maybe");    
        }
    }
    return 0;
}

 

posted @ 2017-03-13 16:46  FallDream  阅读(165)  评论(0编辑  收藏  举报