降雨量 HYSBZ

降雨量

 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 }
View Code
原文地址:https://www.cnblogs.com/yijiull/p/7423505.html