zoukankan      html  css  js  c++  java
  • BZOJ 1012: [JSOI2008]最大数maxnumber

    二次联通门 :  BZOJ 1012: [JSOI2008]最大数maxnumber

    /*
        BZOJ 1012: [JSOI2008]最大数maxnumber
    
        线段树水过。。。
        
        建一颗空树
        然后单点插入, 区间查询即可 
    */
    #include <cstdio>
    
    #define Max  200000
    
    void read (long long &now)
    {
        now = 0;
        register char word = getchar ();
        while (word > '9' || word < '0')
            word = getchar ();
        while (word >= '0' && word <= '9')
        {
            now = now * 10 + word - '0';
            word = getchar ();
        }
    }
            
    inline long long max (long long a, long long b)
    {
        return a > b ? a : b;
    }
    
    long long N;
    long long Mod;
    
    struct Segment
    {
        struct Segment_Tree
        {
            long long l;
            long long r;
            long long Mid;
            long long Maxn;
            
        };
        
        Segment_Tree tree[Max << 3];
        
        void Tree_Build (long long l, long long r, long long now)
        {
            tree[now].l = l;
            tree[now].r = r;
            if (l == r)
                return ;
            tree[now].Mid = (l + r) >> 1;
            Tree_Build (l, tree[now].Mid, now << 1);
            Tree_Build (tree[now].Mid + 1, r, now << 1 | 1);    
        }
        
        void Tree_Insert (long long pos, long long now, long long number)
        {
            if (tree[now].l == tree[now].r)
            {
                tree[now].Maxn = number;
                return ;
            }
            if (pos <= tree[now].Mid)
                Tree_Insert (pos, now << 1, number);
            else
                Tree_Insert (pos, now << 1 | 1, number);
            tree[now].Maxn = max (tree[now << 1].Maxn, tree[now << 1 | 1].Maxn);
        }
        
        long long Tree_Query (long long l, long long r, long long now)
        {
            if (tree[now].l == l && tree[now].r == r)
                return tree[now].Maxn;
            if (r <= tree[now].Mid)
                return Tree_Query (l, r, now << 1);
            else if (l > tree[now].Mid)
                return Tree_Query (l, r, now << 1 | 1);
            else
                return max (Tree_Query (l, tree[now].Mid, now << 1), Tree_Query (tree[now].Mid + 1, r, now << 1 | 1));
        }
        
    };
    
    Segment Tree;
    
    long long Tree_Pos;
    
    int main (int argc, char *argv[])
    {
        read (N);
        read (Mod);
        Tree_Pos = 0;
        Tree.Tree_Build (1, N, 1);
        char type[5];
        long long x;
        long long t = 0;
        while (N--)
        {
            scanf ("%s", type);
            read (x);
            if (type[0] == 'Q')
            {
                t = Tree.Tree_Query (Tree_Pos - x + 1, Tree_Pos, 1);
                printf ("%lld
    ", t);
            }
            else
                Tree.Tree_Insert (++Tree_Pos, 1, (x + t) % Mod); 
        }
        return 0;
    }
  • 相关阅读:
    Web 服务器配置
    Web 浏览
    C++ Web 编程
    C++ 多线程
    C++ 信号处理
    C++ 预处理器
    C++ 模板
    C++ 命名空间
    C++ 动态内存
    C++ 异常处理
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/6746826.html
Copyright © 2011-2022 走看看