zoukankan      html  css  js  c++  java
  • 【BZOJ 1067】 [SCOI2007]降雨量

    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。

    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

    HINT

    100%的数据满足:1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

     
    线段树显然,考虑各种情况
    有一种总是忘了,当不存在末尾年份时,若存在比开头年份降雨量还大的年份就是false
     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 using namespace std;
     5 const int N=50010;
     6 int n,m,l,r,mx,cnt;
     7 int year[N],w[N];
     8 struct tree{int l,r,mx,lch,rch;}tr[N*2];
     9  
    10 void build(int k,int l,int r){
    11     int mid=(l+r)>>1;
    12     tr[++cnt].l=l,tr[cnt].r=r;
    13     if(l==r) return;
    14     tr[k].lch=cnt+1;build(cnt+1,l,mid);
    15     tr[k].rch=cnt+1;build(cnt+1,mid+1,r);
    16 }
    17  
    18 void ins(int k,int x){
    19     int mid=(tr[k].l+tr[k].r)>>1,lc=tr[k].lch,rc=tr[k].rch;
    20     if(tr[k].l==tr[k].r){tr[k].mx=w[x];return;}
    21     if(x>mid) ins(rc,x);else ins(lc,x);
    22     tr[k].mx=max(tr[lc].mx,tr[rc].mx);
    23 }
    24  
    25 int query_max(int k,int l,int r){
    26     if(l>r) return 0;
    27     int mid=(tr[k].l+tr[k].r)>>1,lc=tr[k].lch,rc=tr[k].rch;
    28     if(tr[k].l==l&&tr[k].r==r) return tr[k].mx;
    29     if(r<=mid) return query_max(lc,l,r);
    30     else if(l>mid) return query_max(rc,l,r);
    31     else return max(query_max(lc,l,mid),query_max(rc,mid+1,r));
    32 }
    33  
    34 int main(){
    35     scanf("%d",&n);
    36     build(1,1,n);
    37     for(int i=1;i<=n;i++) scanf("%d%d",&year[i],&w[i]),ins(1,i);
    38     scanf("%d",&m);
    39     for(int i=1;i<=m;i++){
    40         scanf("%d%d",&l,&r);
    41         if(r==year[1]||l==year[n]) {printf("maybe
    ");continue;} 
    42         int x=lower_bound(year+1,year+1+n,l)-year;
    43         int y=lower_bound(year+1,year+1+n,r)-year;
    44         int xx=(year[x]==l),yy=(year[y]==r);
    45         if(!xx&&!yy) {printf("maybe
    ");continue;}
    46         if(!xx&&yy){
    47             mx=query_max(1,x,y-1);
    48             if(mx<w[y]) printf("maybe
    ");else printf("false
    ");
    49             continue; 
    50         }
    51         if(xx&&!yy){
    52             mx=query_max(1,x+1,y-1);
    53             if(mx<w[x]) printf("maybe
    ");else printf("false
    ");
    54             continue;
    55         }
    56         if(xx&&yy) {
    57             if(w[x]<w[y]) {printf("false
    ");continue;};
    58             mx=query_max(1,x+1,y-1);
    59             if(mx>=w[y]){printf("false
    ");continue;}
    60             if((y-x)!=(year[y]-year[x])) {printf("maybe
    ");continue;}
    61             printf("true
    ");   
    62         }
    63     }
    64 } 
  • 相关阅读:
    个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱
    个人永久性免费-Excel催化剂功能第30波-工作表快捷操作(批量创建、命名、排序、工作表目录)
    个人永久性免费-Excel催化剂功能第29波-追加中国特色的中文相关自定义函数
    发现用System.Net.Mail发邮件(代码附后),附件稍微大一点就会造成程序假死. 有没有什么简单的解决办法呢? 多谢!!
    上传文件 获取文件名 --360浏览器
    js中的json对象和字符串之间的转化
    chosen.jquery.js
    select 后台获取text 并根据text 设置value选中项
    iframe中有ajax,设置iframe自适应高度
    charme浏览器 jquery1.9.1min.js 报脚本错误 无jquery.min.map 文件
  • 原文地址:https://www.cnblogs.com/wuminyan/p/5202606.html
Copyright © 2011-2022 走看看