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

    【题目链接】

               点击打开链接

    【算法】

               线段树

               此题细节很多,写程序时要细心!

    【代码】

                 

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 50010
    
    struct Node
    {
            int l,r,mx;
    } Tree[MAXN<<2];
    
    int i,n,l,r,posl,posr,q,mx;
    int sum[MAXN],a[MAXN],y[MAXN];
    
    template <typename T> inline void read(T &x)
    {
        int f = 1; x = 0;
        char c = getchar();
        for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
        for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0';
        x *= f;
    }
    template <typename T> inline void write(T x)
    {
        if (x < 0)
        {
            putchar('-');
            x = -x;
        }
        if (x > 9) write(x/10);
        putchar(x%10+'0');
    }
    template <typename T> inline void writeln(T x)
    {
        write(x);
        puts("");
    }
    inline void update(int index)
    {
            Tree[index].mx = max(Tree[index<<1].mx,Tree[index<<1|1].mx);
    }
    inline void build(int index,int l,int r)
    {
            int mid;
            Tree[index].l = l; Tree[index].r = r;
            if (l == r) 
            {
                    Tree[index].mx = a[l];
                    return;
            }
            mid = (l + r) >> 1;
            build(index<<1,l,mid);
            build(index<<1|1,mid+1,r);
            update(index);
    }
    inline int query_max(int index,int l,int r)
    {
            int mid;
            if (Tree[index].l == l && Tree[index].r == r) return Tree[index].mx;
            mid = (Tree[index].l + Tree[index].r) >> 1;
            if (mid >= r) return query_max(index<<1,l,r);
            else if (mid + 1 <= l) return query_max(index<<1|1,l,r);
            else return max(query_max(index<<1,l,mid),query_max(index<<1|1,mid+1,r));
    }
    int main() {
            
            read(n);
            for (i = 1; i <= n; i++)
            {
                    read(y[i]);
                    read(a[i]);
                    if (i == 1) sum[i] = 1;
                    else sum[i] = sum[i-1] + (y[i] == y[i-1] + 1);        
            }
            build(1,1,n);
            read(q);
            while (q--)
            {
                    read(l); read(r);
                    posl = lower_bound(y+1,y+n+1,l) - y;
                    posr = lower_bound(y+1,y+n+1,r) - y;
                    if (r < l)
                    {
                            puts("false");
                            continue;
                    }
                    if (posl == posr)
                    {
                            if (l == r) puts("true");
                            else puts("maybe");
                            continue;
                    }
                    if (posl + 1 == posr)
                    {
                            if (y[posr] == r && y[posl] != l && a[posr] <= a[posl]) puts("false");
                            else if (y[posl] != l || y[posr] != r) puts("maybe");
                            else if (y[posl] != l && y[posr] != r) puts("maybe");
                            else
                            {
                                    if (a[posr] > a[posl]) puts("false");
                                    else
                                    {
                                            if (l + 1 == r) puts("true");
                                            else puts("maybe");
                                    }
                            }
                            continue;
                    }
                    if (y[posl] == l && y[posr] == r)
                    {
                            if (sum[posr] - sum[posl] == r - l) 
                            {
                                    mx = query_max(1,posl+1,posr-1);
                                    if (a[posr] > mx && a[posr] <= a[posl]) puts("true");
                                    else puts("false");
                            } else
                            {
                                    mx = query_max(1,posl+1,posr-1);
                                    if (a[posr] <= mx || a[posr] > a[posl]) puts("false");
                                    else puts("maybe");
                            }
                            continue;
                    }
                    if (y[posl] == l)
                    {
                            mx = query_max(1,posl+1,posr-1);
                            if (mx >= a[posl]) puts("false");
                            else puts("maybe");
                            continue;        
                    }
                    if (y[posr] == r)
                    {
                            mx = query_max(1,posl,posr-1);
                            if (mx >= a[posr]) puts("false");
                            else puts("maybe");
                            continue;
                    }
                    puts("maybe");
            }
            
            return 0;
        
    }
  • 相关阅读:
    shell中定义变量用双引号和单引号以及不用引号的区别
    如何优雅的解决mac安装zsh不执行.bash_profile
    Spring在非web应用中关闭IoC容器 (registerShutdownHook)
    【Quartz】配置最简单的集群
    【Quartz】将定时任务持久化到数据库
    Mysql字符串字段判断是否包含某个字符串的3种方法
    函数:MySQL中字符串匹配函数LOCATE和POSITION使用方法
    MySQL字符串函数substring:字符串截取
    logback logback.xml常用配置详解 <filter>
    logback 常用配置详解<appender>
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196298.html
Copyright © 2011-2022 走看看