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行每行两个整数yi和ri,为年份和降雨量,按照年份从小到大排列,即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年】:
- x已知并且y已知
- y年降水量不超过x年
- x+1到y-1年已知并且都小于y年降水量
然后是maybe的情况【x年到y年】:
- x已知并且y已知
- y年降水量不超过x年
- x+1到y-1年至少有一年未知并且已知的都小于y年降水量
或
- x已知或y已知
- 若x已知,那么x+1到y年至少有一年未知并且已知的都小于x年降水量
- 若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; }