zoukankan      html  css  js  c++  java
  • 降雨量 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
  • 相关阅读:
    git版本控制入门
    SpringBoot入门基础:编写HelloWorld(三)
    SpringBoot入门基础:构建SpringBoot项目及启动器讲解(二)
    SpringBoot入门基础:介绍(一)
    maven入门基础:为项目分配独立的仓库实践(十七)
    maven入门基础:nexus的权限管理(十六)
    maven入门基础:使用maven部署构件到nexus(十五)
    maven入门基础:配置maven从nexus下载构件(十四)
    maven入门基础:nexus构建搜索(十三)
    事务的写法
  • 原文地址:https://www.cnblogs.com/yijiull/p/7423505.html
Copyright © 2011-2022 走看看