降雨量 HYSBZ - 1067
降雨量
Description
我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未知,有的说法是可能正确也可以不正确的。
Input
输入仅一行包含一个正整数n,为已知的数据。以下n行每行两个整数yi和ri,为年份和降雨量,按照年份从小到大排列,即yi<yi+1。下一行包含一个正整数m,为询问的次数。以下m行每行包含两个数Y和X,即询问“X年是自Y年以来降雨量最多的。”这句话是必真、必假还是“有可能”。
Output
对于每一个询问,输出true,false或者maybe。
看见一堆if、else就头疼,,逻辑思维太差了=_=
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 const int maxn=50010; 6 struct Node{ 7 int year,rain; 8 }p[maxn]; 9 int n,m; 10 int dp[maxn][26]; 11 void RMQ_INIT(){ 12 for(int i=0;i<n;i++) dp[i][0]=p[i].rain; 13 for(int j=1;(1<<j)-1<n;j++){ 14 for(int i=0;i+(1<<j)-1<n;i++){ 15 dp[i][j]=max(dp[i][j-1],dp[i+(1<<j-1)][j-1]); 16 } 17 } 18 } 19 int RMQ(int l,int r){ 20 if(l>r) return -1e9; 21 int k=0; 22 while((1<<k+1)-1<=r-l) k++; 23 return max(dp[l][k],dp[r-(1<<k)+1][k]); 24 } 25 // >=x 26 int bin(int x){ 27 int L=0,R=n-1; 28 while(L<=R){ 29 int m=(R+L)>>1; 30 if(p[m].year>=x) R=m-1; 31 else L=m+1; 32 } 33 return L; 34 } 35 36 int main(){ 37 int T; 38 while(scanf("%d",&n)!=EOF){ 39 for(int i=0;i<n;i++) scanf("%d%d",&p[i].year,&p[i].rain); 40 RMQ_INIT(); 41 scanf("%d",&m); 42 int x,y; 43 while(m--){ 44 int flag=-1; //不可能 45 scanf("%d%d",&x,&y); 46 int st=bin(x),ed=bin(y); 47 int l=st<n&&p[st].year==x; 48 int r=ed<n&&p[ed].year==y; 49 if(!r) ed--; 50 if(l){ 51 if(r){ 52 int m=RMQ(st+1,ed-1); 53 if(p[st].rain<p[ed].rain) flag=-1; 54 else { 55 if(m<p[ed].rain){ 56 if(ed-st==y-x) flag=1; 57 else flag=0; 58 }else flag=-1; 59 } 60 }else{ 61 int m=RMQ(st+1,ed); 62 if(m<p[st].rain) flag=0; 63 else flag=-1; 64 65 } 66 }else{ 67 if(r){ 68 int m=RMQ(st,ed-1); 69 if(m<p[ed].rain) flag=0; 70 else flag=-1; 71 }else flag=0; 72 } 73 if(flag==-1) puts("false"); 74 else if(flag==0) puts("maybe"); 75 else puts("true"); 76 } 77 } 78 return 0; 79 }