• FZU Problem 2171 防守阵地 II (线段树区间更新模板题)


    http://acm.fzu.edu.cn/problem.php?pid=2171

    成段增减,区间求和.add累加更新的次数。

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <vector>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <functional>
    #include <numeric>
    #include <sstream>
    #include <stack>
    #include <map>
    #include <queue>
    #pragma comment(linker, "/STACK:102400000,102400000")
    #define CL(arr, val)    memset(arr, val, sizeof(arr))
    
    #define ll long long
    #define inf 0x7f7f7f7f
    #define lc l,m,rt<<1
    #define rc m + 1,r,rt<<1|1
    #define pi acos(-1.0)
    
    #define L(x)    (x) << 1
    #define R(x)    (x) << 1 | 1
    #define MID(l, r)   (l + r) >> 1
    #define Min(x, y)   (x) < (y) ? (x) : (y)
    #define Max(x, y)   (x) < (y) ? (y) : (x)
    #define E(x)        (1 << (x))
    #define iabs(x)     (x) < 0 ? -(x) : (x)
    #define OUT(x)  printf("%I64d
    ", x)
    #define lowbit(x)   (x)&(-x)
    #define Read()  freopen("a.txt", "r", stdin)
    #define Write() freopen("b.txt", "w", stdout);
    #define maxn 100010
    #define mod 1000000007
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    int sum[maxn<<2];
    int add[maxn<<2];
    
    void PushUp(int rt)
    {
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    
    void PushDown(int rt,int m)
    {
        if(add[rt])
        {
            add[rt<<1]+=add[rt];
            add[rt<<1|1]+=add[rt];
            sum[rt<<1]+=(m-(m>>1))*add[rt];
            sum[rt<<1|1]+=(m>>1)*add[rt];
            add[rt]=0;
        }
    }
    
    void build(int l,int r,int rt)
    {
        add[rt]=0;
        if(l==r)
        {
            scanf("%d",&sum[rt]);
            return;
        }
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        PushUp(rt);
    }
    
    void update(int L,int R,int c,int l,int r,int rt)
    {
        if(L<=l&&r<=R)
        {
            add[rt]+=c;
            sum[rt]+=c*(r-l+1);
            return;
        }
        PushDown(rt,r-l+1);
        int m=(l+r)>>1;
        if(L<=m) update(L,R,c,lson);
        if(m<R) update(L,R,c,rson);
        PushUp(rt);
    }
    
    int query(int L,int R,int l,int r,int rt)
    {
        if(L<=l&&r<=R)
        {
            return sum[rt];
        }
        PushDown(rt,r-l+1);
        int m=(l+r)>>1;
        int ret=0;
        if(L<=m) ret+=query(L,R,lson);
        if(m<R) ret+=query(L,R,rson);
        return ret;
    }
    int main()
    {
       // freopen("a.txt","r",stdin);
        int n,m,q;
        while(~scanf("%d%d%d",&n,&m,&q))
        {
            build(1,n,1);
            int ans,x;
            while(q--)
            {
                scanf("%d",&x);
                ans=query(x,x+m-1,1,n,1);
                update(x,x+m-1,-1,1,n,1);
                printf("%d
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    tfrecord
    数据挖掘模型中的IV和WOE详解
    GBDT
    tensorflow笔记 :常用函数说明
    GAN
    牛客挑战赛 39 牛牛与序列 隔板法 容斥 dp
    4.19 省选模拟赛 跳跃 倍增 二分 线段树 建图
    牛客挑战赛39 牛牛的等差数列
    luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询
    牛客挑战赛39 D 牛牛的数学题 NTT FMT FWT
  • 原文地址:https://www.cnblogs.com/nowandforever/p/4581490.html
Copyright © 2020-2023  润新知