咱們經常會說這樣的話:「X年是自Y年以來降雨量最多的」。它的含義是X年的降雨量不超過Y年,且對於任意
Y<Z<X,Z年的降雨量嚴格小於X年。例如2002,2003,2004和2005年的降雨量分別爲4920,5901,2832和3890,
則能夠說「2005年是自2003年以來最多的」,但不能說「2005年是自2002年以來最多的」因爲有些年份的降雨量未
知,有的說法是可能正確也能夠不正確的。php
咱們經常會說這樣的話:「X年是自Y年以來降雨量最多的」。它的含義是X年的降雨量不超過Y年,且對於任意
Y<Z<X,Z年的降雨量嚴格小於X年。例如2002,2003,2004和2005年的降雨量分別爲4920,5901,2832和3890,
則能夠說「2005年是自2003年以來最多的」,但不能說「2005年是自2002年以來最多的」因爲有些年份的降雨量未
知,有的說法是可能正確也能夠不正確的。php
輸入僅一行包含一個正整數n,爲已知的數據。如下n行每行兩個整數yi和ri,爲年份和降雨量,按照年份從小
到大排列,即yi<yi+1。下一行包含一個正整數m,爲詢問的次數。如下m行每行包含兩個數Y和X,即詢問「X年是
自Y年以來降雨量最多的。」這句話是必真、必假仍是「有可能」。數組
對於每個詢問,輸出true,false或者maybe。ui
100%的數據知足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9spa
POJ 2637 WorstWeather Evercode
這道題,,,離散化一下年份,每次詢問二分一下左右端點,查詢最大值用線段樹或者st表都行;blog
然而,斷定賊噁心。。。ip
//我這裏x,y的含義互換了,x<y ,l,r是x,y對應的數組座標,z=max_(l+1,r-1)QUQ get
if(x&&z>=x) false;io
if(y&&z>=y) false;class
if(x&&y),x<y false;
else
if(x&&y&&l-r+1==y-x-1) true;
else maybe;
1 #include<cstdio> 2 const int maxn=5e4+10; 3 inline int min_(int x,int y){return x<y?x:y;} 4 inline int max_(int x,int y){return x>y?x:y;} 5 int n,m; 6 int a[maxn],b[maxn]; 7 int t[maxn<<2]; 8 int lower_bound(int k){ 9 int mid,l=1,r=n; 10 while(l<r){ 11 mid=l+r>>1; 12 if(a[mid]<k) l=mid+1; 13 else r=mid; 14 } 15 return l; 16 } 17 void build(int k,int l,int r){ 18 if(l==r){ 19 t[k]=b[l]; 20 return; 21 } 22 int mid=l+r>>1,ls=k<<1,rs=ls|1; 23 build(ls,l,mid); 24 build(rs,mid+1,r); 25 t[k]=max_(t[ls],t[rs]); 26 } 27 int search(int k,int l,int r,int al,int ar){ 28 if(al>ar) return -1e9; 29 if(l==al&&r==ar) return t[k]; 30 int mid=l+r>>1,ls=k<<1,rs=ls|1,ret=-1e9; 31 if(al<=mid) ret=max_(ret,search(ls,l,mid,al,min_(ar,mid))); 32 if(ar>mid) ret=max_(ret,search(rs,mid+1,r,max_(al,mid+1),ar)); 33 return ret; 34 } 35 int main(){ 36 scanf("%d",&n); 37 a[0]=-1e9-1,a[n+1]=1e9+1; 38 for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); 39 build(1,1,n); 40 int x,y,z,l,r; 41 scanf("%d",&m); 42 for(int i=1;i<=m;i++){ 43 scanf("%d%d",&x,&y); 44 l=lower_bound(x); 45 while(a[l]<=x) l++; 46 r=lower_bound(y); 47 while(a[r]>=y) r--; 48 z=search(1,1,n,l,r); 49 if((a[r+1]==y&&z>=b[r+1])||(a[l-1]==x&&z>=b[l-1])||(a[l-1]==x&&a[r+1]==y&&b[l-1]<b[r+1])) puts("false"); 50 else{ 51 if(r-l+1==y-x-1&&a[l-1]==x&&a[r+1]==y) puts("true"); 52 else puts("maybe"); 53 } 54 } 55 return 0; 56 }