2439 降雨量

2439 降雨量

 

2007年省队选拔赛四川

 时间限制: 1 s
 空间限制: 64000 KB
 题目等级 : 大师 Master
 
 
题目描述 Description

我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。

输入描述 Input Description

输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yiri,为年份和降雨量,按照年份从小到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。

输出描述 Output Description

对于每一个询问,输出true,false或者maybe。

样例输入 Sample Input

6

2002 4920

2003 5901

2004 2832

2005 3890

2007 5609

2008 3024

5

2002 2005

2003 2005

2002 2007

2003 2007

2005 2008

 

样例输出 Sample Output

false

true

false

maybe

false

数据范围及提示 Data Size & Hint

100%的数据满足:1<=n<=50000, 1<=m<=10000, -109<=yi<=109, 1<=ri<=109

分类标签 Tags 点此展开 

 
 

题解:

(狗血的判断,比着别人的拍出来了)

我们来考虑true的情况【x年到y年】:

  1. x已知并且y已知
  2. y年降水量不超过x年
  3. x+1到y-1年已知并且都小于y年降水量

然后是maybe的情况【x年到y年】:

  1. x已知并且y已知
  2. y年降水量不超过x年
  3. x+1到y-1年至少有一年未知并且已知的都小于y年降水量

  1. x已知或y已知
  2. 若x已知,那么x+1到y年至少有一年未知并且已知的都小于x年降水量
  3. 若y已知,那么x到y-1年至少有一年未知并且已知的都小于y年降水量

最后是false的情况,如果不是以上两种情况,就是false

 
AC代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
int n,a[N],w[N],f[N][25];
inline const int read(){
    register int x=0,f=1;
    register char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline void RMQ(){
    for(int j=1;j<=20;j++){
        for(int i=1;i+(1<<j)-1<=n;i++){
            f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
        }
    }
}
inline int query(int i,int j){
    if(i>j) return -2000000000;
    int k=log(j-i+1)/log(2);
    return max(f[i][k],f[j-(1<<k)+1][k]);
}
int main(){
    n=read();
    for(int i=1;i<=n;i++) a[i]=read(),f[i][0]=w[i]=read();
    RMQ();
    int maxx,l,r,x,y,ans,T=read();
    while(T--){
        x=read();y=read();
        l=lower_bound(a+1,a+n+1,x)-a;
        r=lower_bound(a+1,a+n+1,y)-a;
        if(l<=n&&a[l]==x){
            if(r<=n&&a[r]==y){
                maxx=query(l+1,r-1);
                if(w[l]<w[r]) ans=0;
                else if(maxx<w[r]){
                    if(r-l==y-x) ans=1;
                    else ans=-1;
                }
                else ans=0;
            }
            else{
                maxx=query(l+1,r-1);
                if(maxx<w[l]) ans=-1;
                else ans=0;
            }
        }
        else{
            if(r<=n&&a[r]==y){
                maxx=query(l,r-1);
                if(maxx<w[r]) ans=-1;
                else ans=0;
            }
            else ans=-1;
        }
        if(ans==1) puts("true");
        else if(ans==-1) puts("maybe");
        else puts("false");
    }
    return 0;
}

 

 
posted @ 2016-08-11 20:26  神犇(shenben)  阅读(307)  评论(1编辑  收藏  举报