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

    新人求助,降雨量那题本机AC提交WAWAWA……

    原题:

    我们常常会说这样的话:“X年是自Y年以来降雨量最多的”。它的含义是X年的降雨量不超过Y年,且对于任意
    Y<Z<X,Z年的降雨量严格小于X年。例如2002,2003,2004和2005年的降雨量分别为4920,5901,2832和3890,
    则可以说“2005年是自2003年以来最多的”,但不能说“2005年是自2002年以来最多的”由于有些年份的降雨量未
    知,有的说法是可能正确也可以不正确的。

    1<=n<=50000, 1<=m<=10000, -10^9<=yi<=10^9, 1<=ri<=10^9

    以前的博客说这题没啥思维难度,难就难在细节讨论

    这次写信心爆棚认为老子现在问题处理地多棒,只需转化某些要点的表达方式就可以避免讨论

    然后……

     

     行吧,这次是我被练了

    代码:

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 const int oo=1000000007;
     5 int n,a[51000],b[51000],m;
     6 int v[210000];  bool u[210000];
     7 void gtsgmttr(int x,int l,int r){
     8     if(l==r){
     9         v[x]=b[l],u[x]=false;
    10         return ;
    11     }
    12     int md=(l+r)>>1;
    13     gtsgmttr(x<<1,l,md),gtsgmttr(x<<1|1,md+1,r);
    14     v[x]=max(v[x<<1],v[x<<1|1]);
    15     u[x]=(u[x<<1]|u[x<<1|1]|(a[md]+1!=a[md+1]));
    16 }
    17 int qrv(int x,int l,int r,int ql,int qr){
    18     if(l==ql && r==qr)  return v[x];
    19     int md=(l+r)>>1;
    20     if(ql<=md && qr>md)
    21         return max(qrv(x<<1,l,md,ql,md),qrv(x<<1|1,md+1,r,md+1,qr));
    22     else if(qr<=md)  return qrv(x<<1,l,md,ql,qr);
    23     else  return qrv(x<<1|1,md+1,r,ql,qr);
    24 }
    25 bool qru(int x,int l,int r,int ql,int qr){
    26     if(l==ql && r==qr)  return u[x];
    27     int md=(l+r)>>1;
    28     if(ql<=md && qr>md)
    29         return (qru(x<<1,l,md,ql,md)|qru(x<<1|1,md+1,r,md+1,qr)|(a[md]+1!=a[md+1]));
    30     else if(qr<=md)  return qru(x<<1,l,md,ql,qr);
    31     else  return qru(x<<1|1,md+1,r,ql,qr);
    32 }
    33 int bnrsch(int x){  //如果找不到默认输出左侧的
    34     int l=0,r=n,md;
    35     //int l=1,r=n,md;
    36     //如果l初值为1,则若左端点小于最小值,那么实际返回的是右侧的
    37     while(l+1<r){
    38         md=(l+r)>>1;
    39         (a[md]<x ? l : r)=md;
    40     }
    41     //return (a[l]!=x && a[r]!=x ? -1 : (a[l]==x ? l : r));
    42     return a[r]==x ? r : l;
    43 }
    44 int main(){
    45     freopen("ddd.in","r",stdin);
    46     cin>>n;
    47     for(int i=1;i<=n;++i)  scanf("%d%d",&a[i],&b[i]);
    48     gtsgmttr(1,1,n);
    49     cin>>m;
    50     int l,r,x,y;
    51     while(m --> 0){
    52         scanf("%d%d",&x,&y);
    53         l=bnrsch(x),r=bnrsch(y);
    54         if(x>=y+1)  printf("false
    ");
    55         //else if(a[r]!=y || a[l]!=x)  printf("maybe
    ");
    56         if(a[l]!=x && a[r]!=y)  printf("maybe
    ");
    57         else if(a[l]!=x || a[r]!=y){
    58             //注意如果两个端点只知道一个也是能判必错的
    59             int tmp=(l+1<=r-(a[r]==y) ? qrv(1,1,n,l+1,r-(a[r]==y)) : 0);
    60             if(a[l]!=x ? b[r]<=tmp : b[l]<=tmp)  printf("false
    ");
    61             else printf("maybe
    ");
    62         }
    63         else if(b[r]>b[l])  printf("false
    ");
    64         else{
    65             int tmp=(l+1<=r-1 ? qrv(1,1,n,l+1,r-1) : 0);
    66             if(b[r]<=tmp)  printf("false
    ");
    67             else if(qru(1,1,n,l,r))  printf("maybe
    ");
    68             else  printf("true
    ");
    69         }
    70     }
    71     return 0;
    72 }
    View Code
  • 相关阅读:
    Linux下安装破解JIRA 6.3.6 并连接MYSQL5
    centos7 系统安装问题汇总
    CentOS7安装iptables防火墙
    Vue全家桶实战 从零独立开发企业级电商系统
    小米笔记本pro充电10秒断开
    mac电脑的使用
    autojs解决方案
    auto.js连接vscode
    小米6手机刷机亲测详解
    #002前端基础-JS-浏览器中堆栈内存的底层处理
  • 原文地址:https://www.cnblogs.com/cdcq/p/12057643.html
Copyright © 2011-2022 走看看