zoukankan      html  css  js  c++  java
  • 【BZOJ1067】【POJ2637】降雨量

    1067: [SCOI2007]降雨量

    Time Limit: 1 Sec  Memory Limit: 162 MB
    Submit: 3004  Solved: 767
    [Submit][Status][Discuss]

    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

    Source

    首先,妈妈我要报警了,WA了N次,WA一次改一次,主要是分类讨论的问题,所谓谋而后动,根据每个错误点针对性的改错并不能治本,编了一下午,结果晚上不到30min,重新理清思路编了一遍直接A了,思路才是一次编程的核心,思路对了,才为AC奠定基础。但我还是要报警nmb。
    ps:心狠累。。具体不写了。。程序清楚明了。。。
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cmath>
     5 #define N 50000
     6 using namespace std;
     7 struct  data{int mx,lx,rx,k;}seg[N*4];
     8 int n,m,lb,fb,hb,px,py,maxn,ct;
     9 int know[N],a[N],rain[N];
    10 void updata(int now)
    11 {
    12     seg[now].mx=max(seg[(now<<1)].mx,seg[(now<<1)+1].mx);
    13     seg[now].k=seg[(now<<1)].k|seg[(now<<1)+1].k;
    14 }
    15 void buildtree(int now,int l,int r)
    16 {
    17     seg[now].lx=l;  seg[now].rx=r;
    18     if  (l==r)  {seg[now].mx=rain[l];   seg[now].k=know[l]; return;}
    19     int mid=(l+r)>>1;
    20     buildtree((now<<1),l,mid);
    21     buildtree((now<<1)+1,mid+1,r);
    22     updata(now);
    23 }
    24 int query(int now,int begin,int end)
    25 {
    26     int l=seg[now].lx,r=seg[now].rx;
    27     if (begin<=l && end>=r)   {hb=hb|seg[now].k;  return seg[now].mx;}
    28     int mid=(l+r)>>1,ans=0;
    29     if (begin<=mid)  ans=max(query((now<<1),begin,end),ans);
    30     if (end>mid) ans=max(query((now<<1)+1,begin,end),ans);
    31     return ans;
    32 }
    33 int main()
    34 {
    35     int i;
    36     int x,y;
    37     scanf("%d",&n);
    38     for (i=1;i<=n;i++)
    39     {
    40         scanf("%d%d",&a[i],&rain[i]);
    41         if (a[i]-a[i-1]!=1&&i!=1)   know[i]=1;
    42     }
    43     buildtree(1,1,n);
    44     scanf("%d",&m);
    45     for (i=1;i<=m;i++)
    46     {
    47         fb=0;   hb=0;   lb=0;   
    48         scanf("%d%d",&x,&y);
    49         if (x>=y)    {printf("false
    "); continue;}
    50         if (y<=a[1]||x>=a[n])   {printf("maybe
    ");continue;}
    51         px=lower_bound(a+1,a+n+1,x)-a;  py=lower_bound(a+1,a+n+1,y)-a;
    52         if (a[px]!=x)   fb=1;   if (a[py]!=y)   lb=1;
    53         if (fb&&lb) {printf("maybe
    ");continue;}
    54         if (!fb)
    55             if (a[px+1]-a[px]!=1)   hb=1;
    56         if (!lb)
    57             if (a[py]-a[py-1]!=1)   hb=1;
    58         if (fb&&lb) maxn=query(1,px,py-1);
    59         else    if (!fb&&lb)    maxn=query(1,px+1,py-1);
    60         else    if (fb&&!lb)    maxn=query(1,px,py-1);
    61         else    if (!fb&&!lb)   maxn=query(1,px+1,py-1);
    62         if (!fb&&!lb&&!hb&&rain[px]>=rain[py]&&maxn<rain[py]) {printf("true
    ");continue;}
    63         if (!fb&&!lb&&hb&&rain[px]>=rain[py]&&maxn<rain[py])  {printf("maybe
    ");continue;}
    64         if (!fb&&lb&&maxn<rain[px])  {printf("maybe
    "); continue;}
    65         if (fb&&!lb&&maxn<rain[py])  {printf("maybe
    "); continue;}
    66         printf("false
    ");
    67     }
    68     return 0;
    69 }
    BZOJ版
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cmath>
     5 #include <cstring>
     6 #define N 50000
     7 using namespace std;
     8 struct  data{int mx,lx,rx,k;}seg[N*4];
     9 int n,m,lb,fb,hb,px,py,maxn,T;
    10 int know[N],a[N],rain[N];
    11 void updata(int now)
    12 {
    13     seg[now].mx=max(seg[(now<<1)].mx,seg[(now<<1)+1].mx);
    14     seg[now].k=seg[(now<<1)].k|seg[(now<<1)+1].k;
    15 }
    16 void buildtree(int now,int l,int r)
    17 {
    18     seg[now].lx=l;  seg[now].rx=r;
    19     if  (l==r)  {seg[now].mx=rain[l];   seg[now].k=know[l]; return;}
    20     int mid=(l+r)>>1;
    21     buildtree((now<<1),l,mid);
    22     buildtree((now<<1)+1,mid+1,r);
    23     updata(now);
    24 }
    25 int query(int now,int begin,int end)
    26 {
    27     int l=seg[now].lx,r=seg[now].rx;
    28     if (begin<=l && end>=r)   {hb=hb|seg[now].k;  return seg[now].mx;}
    29     int mid=(l+r)>>1,ans=0;
    30     if (begin<=mid)  ans=max(query((now<<1),begin,end),ans);
    31     if (end>mid)    ans=max(query((now<<1)+1,begin,end),ans);
    32     return ans;
    33 }
    34 int main()
    35 {
    36     int i;
    37     int x,y;
    38     while (~scanf("%d",&n))
    39     {
    40     if (n==0) break;
    41     memset(seg,0,sizeof(seg));
    42     memset(rain,0,sizeof(rain));
    43     memset(know,0,sizeof(know));
    44     memset(a,0,sizeof(a));
    45     for (i=1;i<=n;i++)
    46     {
    47         scanf("%d%d",&a[i],&rain[i]);
    48         if (a[i]-a[i-1]!=1&&i!=1)   know[i]=1;
    49     }
    50     buildtree(1,1,n);
    51     scanf("%d",&m);
    52     for (i=1;i<=m;i++)
    53     {
    54         fb=0;   hb=0;   lb=0;    
    55         scanf("%d%d",&x,&y);
    56         if (x>=y)    {printf("false
    ");    continue;}
    57         if (y<=a[1]||x>=a[n])   {printf("maybe
    ");continue;}
    58         px=lower_bound(a+1,a+n+1,x)-a;  py=lower_bound(a+1,a+n+1,y)-a;
    59         if (a[px]!=x)    fb=1;    if (a[py]!=y)    lb=1;
    60         if (fb&&lb)    {printf("maybe
    ");continue;}
    61         if (!fb)
    62             if (a[px+1]-a[px]!=1)    hb=1;
    63         if (!lb)
    64             if (a[py]-a[py-1]!=1)    hb=1;
    65         if (fb&&lb)    maxn=query(1,px,py-1);
    66         else    if (!fb&&lb)    maxn=query(1,px+1,py-1);
    67         else    if (fb&&!lb)    maxn=query(1,px,py-1);
    68         else    if (!fb&&!lb)    maxn=query(1,px+1,py-1);
    69         if (!fb&&!lb&&!hb&&rain[px]>=rain[py]&&maxn<rain[py])    {printf("true
    ");continue;}
    70         if (!fb&&!lb&&hb&&rain[px]>=rain[py]&&maxn<rain[py])    {printf("maybe
    ");continue;}
    71         if (!fb&&lb&&maxn<rain[px])    {printf("maybe
    ");    continue;}
    72         if (fb&&!lb&&maxn<rain[py])    {printf("maybe
    ");    continue;}
    73         printf("false
    ");
    74     }
    75     printf("
    ");
    76     }
    77     return 0;
    78 }
    POJ版(多组数据)
    —Anime Otaku Save The World.
  • 相关阅读:
    [哈希][倍增] Jzoj P5856 01串
    [exgcd] Jzoj P5855 吃蛋糕
    [折半搜索][分治][二分] Jzoj P5851 f
    [lca][主席树] Jzoj P5850 e
    [二分][树状数组] Jzoj P5849 d
    [容斥] Jzoj P5843 b
    [前缀和][枚举] Jzoj P5842 a
    [平衡规划][模拟][前缀和] Jzoj P4724 斐波那契
    [spfa] Jzoj P4722 跳楼机
    [模拟] Jzoj P2499 东风谷早苗
  • 原文地址:https://www.cnblogs.com/DMoon/p/5117395.html
Copyright © 2011-2022 走看看