zoukankan      html  css  js  c++  java
  • [codevs]线段树练习5

    http://codevs.cn/problem/4927/

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <string>
    
    
    using namespace std;
    const int N = 1e5 + 10;
    
    #define oo 1423333339
    #define LL long long
    #define gg 465432477
    
    struct Node {
        LL l, r, w, f, mx, mi, fg;
        bool qs;
    } T[N << 2];
    LL n, m, answer, maxn, minn;
    
    inline LL read() {
        LL x = 0, f = 1;
        char c = getchar();
        while(c < '0' || c > '9') { if(c == '-')f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    
    void imp(LL jd) {
        T[jd].w = T[jd << 1].w + T[jd << 1 | 1].w;
        T[jd].mx = max(T[jd << 1].mx, T[jd << 1 | 1].mx);
        T[jd].mi = min(T[jd << 1].mi, T[jd << 1 | 1].mi);
    }
    
    void down(LL jd) {
        if(T[jd].qs) {
            T[jd << 1].f = 0;
            T[jd << 1].qs = 1;
            T[jd << 1].fg = T[jd].fg;
            T[jd << 1].w = (T[jd << 1].r - T[jd << 1].l + 1) * T[jd].fg;
    
            T[jd << 1 | 1].f = 0;
            T[jd << 1 | 1].qs = 1;
            T[jd << 1 | 1].fg = T[jd].fg;
            T[jd << 1 | 1].w = (T[jd << 1 | 1].r - T[jd << 1 | 1].l + 1) * T[jd].fg;
    
            T[jd << 1].mi = T[jd << 1].mx = T[jd << 1 | 1].mi= T[jd << 1 | 1].mx=T[jd].fg;
    
            T[jd].fg = 0;
            T[jd].qs = 0;
        }
        if(T[jd].f) {
            T[jd << 1].f += T[jd].f;
            T[jd << 1].w += (T[jd << 1].r - T[jd << 1].l + 1) * T[jd].f;
            T[jd << 1].mi += T[jd].f;
            T[jd << 1].mx += T[jd].f;
    
            T[jd << 1 | 1].f += T[jd].f;
            T[jd << 1 | 1].w += (T[jd << 1 | 1].r - T[jd << 1 | 1].l + 1) * T[jd].f;
            T[jd << 1 | 1].mi += T[jd].f;
            T[jd << 1 | 1].mx += T[jd].f;
    
            T[jd].f = 0;
        }
        return ;
    }
    
    void build_tree(LL l, LL r, LL jd) {
        T[jd].l = l;
        T[jd].r = r;
        if(l == r) {
            T[jd].w = read();
            T[jd].mx = T[jd].w;
            T[jd].mi = T[jd].w;
            return ;
        }
        LL mid = (l + r) >> 1;
        build_tree(l, mid, jd << 1);
        build_tree(mid + 1, r, jd << 1 | 1);
        imp(jd);
    }
    
    void Sec_g(LL l, LL r, LL jd, LL x, LL y, LL yj) {
        if(x <= l && r <= y) {
            T[jd].f += yj;
            T[jd].w += (T[jd].r - T[jd].l + 1) * yj;
            T[jd].mi += yj;
            T[jd].mx += yj;
            return ;
        }
        if(T[jd].f || T[jd].qs)
            down(jd);
        LL mid = (l + r) >> 1;
        if(x <= mid)
            Sec_g(l, mid, jd << 1, x, y, yj);
        if(y > mid)
            Sec_g(mid + 1, r, jd << 1 | 1, x, y, yj);
        imp(jd);
    }
    
    void Sec_set(LL l, LL r, LL jd, LL x, LL y, LL k) {
        if(x <= l && r <= y) {
            T[jd].fg = k;
            T[jd].qs = 1;
            T[jd].w = (T[jd].r - T[jd].l + 1) * T[jd].fg;
            T[jd].mx = k;
            T[jd].mi = k;
            T[jd].f = 0;
            return ;
        }
        LL mid = (l + r ) >> 1;
        if(T[jd].f || T[jd].qs)
            down(jd);
        if(x <= mid)
            Sec_set(l, mid, jd << 1, x, y, k);
        if(y > mid)
            Sec_set(mid + 1, r, jd << 1 | 1, x, y, k);
        imp(jd);
    }
    
    void Sec_calc(LL l, LL r, LL jd, LL x, LL y) {
        if(x <= l && r <= y) {
            answer += T[jd].w;
            return;
        }
        if(T[jd].f || T[jd].qs)
            down(jd);
        LL mid = (l + r) >> 1;
        if(x <= mid)
            Sec_calc(l, mid, jd << 1, x, y);
        if(y > mid)
            Sec_calc(mid + 1, r, jd << 1 | 1, x, y);
    }
    
    void Sec_min(LL l, LL r, LL jd, LL x, LL y) {
        if(x <= l && r <= y) {
            minn = min(minn, T[jd].mi);
            return ;
        }
        if(T[jd].f || T[jd].qs)
            down(jd);
        LL mid = (l + r) >> 1;
        if(x <= mid)
            Sec_min(l, mid, jd << 1, x, y);
        if(y > mid)
            Sec_min(mid + 1, r, jd << 1 | 1, x, y);
    }
    
    void Sec_max(LL l, LL r, LL jd, LL x, LL y) {
        if(x <= l && r <= y) {
            maxn = max(maxn, T[jd].mx);
            return ;
        }
        if(T[jd].f || T[jd].qs)
            down(jd);
        LL mid = (l + r) >> 1;
        if(x <= mid)
            Sec_max(l, mid, jd << 1, x, y);
        if(y > mid)
            Sec_max(mid + 1, r, jd << 1 | 1, x, y);
    }
    
    int main() {
        freopen("gg.in", "r", stdin);
        n = read();
        m = read();
        build_tree(1, n, 1);
        for(LL i = 1; i <= m; i ++) {
            string s;
            cin >> s;
            LL x = read();
            LL y = read();
            if(s == "add") {
                LL k = read();
                Sec_g(1, n, 1, x, y, k);
                continue;
            }
            if(s == "set") {
                LL k = read();
                Sec_set(1, n, 1, x, y, k);
                continue;
            }
            if(s == "sum") {
                answer = 0;
                Sec_calc(1, n, 1, x, y);
                printf("%lld
    ", answer);
                continue;
            }
            if(s == "min") {
                minn = oo;
                Sec_min(1, n, 1, x, y);
                printf("%lld
    ", minn);
                continue;
            }
            if(s == "max") {
                maxn = -oo;
                Sec_max(1, n, 1, x, y);
                printf("%lld
    ", maxn);
                continue;
            }
        }
        return 0;
    }
    /*
    10 6
    3 9 2 8 1 7 5 0 4 6
    add 4 9 4
    set 2 6 2
    sum 2 10
    max 1 7
    min 3 6
    */
  • 相关阅读:
    浅析Python模块的引入和调用
    一篇文章带你了解CSS定位知识
    盘点4大下载神器,教你分分钟搞定文件下载
    Mysql查询语句进阶知识集锦
    (原创)高DPI适配经验系列:(四)高DPI适配示例
    (原创)高DPI适配经验系列:(三)字体与字号、缩放锚点
    (原创)IconFont(矢量图标字体)在Winform中的应用
    (原创)高DPI适配经验系列:(二)按DPI范围适配
    (原创)高DPI适配经验系列:(一)缩放比例与DPI对应关系
    [C#] (原创)一步一步教你自定义控件——06,MaskLayer(遮罩层)
  • 原文地址:https://www.cnblogs.com/shandongs1/p/8149208.html
Copyright © 2011-2022 走看看