• FZU 2171 防守阵地 II(线段树区间修改)


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

    Description
    部队中总共有N个士兵,每个士兵有各自的能力指数Xi,
    在一次演练中,指挥部确定了M个需要防守的地点,
    指挥部将选择M个士兵依次进入指定地点进行防守任务,
    获得的参考指数即为M个士兵的能力之和。

    随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,
    每个参加完防守任务的士兵由于疲惫等原因能力指数将下降1。

    现在士兵们排成一排,请你计算出每次进行防守的士兵的参考指数。

    Input
    输入包含多组数据。

    输入第一行有两个整数N,M,Q(1<=N<=100000,1<=M<=1000,1<=Q<=100000),
    第二行N个整数表示每个士兵对应的能力指数Xi(1<=Xi<=1000)。

    接下来Q行,每行一个整数X,
    表示在原始队列中以X为起始的M个士兵替换之前的士兵进行防守。(1<=X<=N-M+1)

    Output
    输出Q行,每行一个整数,为每次指令执行之后进行防守的士兵参考指数。

    Sample Input
    5 3 3
    2 1 3 1 4
    1
    2
    3
    Sample Output
    6
    3
    5

    一开始是看到觉得眼熟还有点小激动 结果数组没开4倍 简直了= =

    之前有问过王大神 这题用线段树点修改是必超时的 就去看了 区间修改

    目前有感觉只能套模板 还不能做到很流畅地运用

    思路:

    先建好线段树

    每次操作其实就是先 query(x,x+m-1) 

    然后再 update(x,x+m-1)

    (最后疲劳度有可能小于0)

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll __int64
    #define MAXN 1000
    #define INF 0x7ffffff
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    using namespace std;
    int sum[400000+10];// n<<2!!!!!
    int add[1000000];
    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]+=add[rt]*(m-(m>>1));
            sum[rt<<1|1]+=add[rt]*(m>>1);
            add[rt]=0;
        }
    }
    void build(int l,int r,int rt)
    {
        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(R<=m) update(L,R,c,lson);
        else if(L>m) update(L,R,c,rson);
        else
        {
            update(L,R,c,lson);
            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(R<=m) ret+=query(L,R,lson); else if(L>m) ret+=query(L,R,rson); else { ret+=query(L,R,lson); ret+=query(L,R,rson); } return ret; } int main() { int i,j,n,m,q,wen,jian; while(scanf("%d%d%d",&n,&m,&q)!=EOF) { mem(add,0); build(1,n,1); for(i=1;i<=q;i++) { scanf("%d",&wen); printf("%d ",query(wen,wen+m-1,1,n,1)); update(wen,wen+m-1,-1,1,n,1); } } return 0; }
  • 相关阅读:
    【JZOJ3188】找数【数论,数学】
    【JZOJ3187】的士【模拟】
    【JZOJ3187】的士【模拟】
    【洛谷P1641】生成字符串【数论,数学】
    【洛谷P1896】互不侵犯【状压dp】
    聚集索引与非聚集索引
    哈希索引
    索引能提高检索速度,降低维护速度
    MySQL索引基本知识
    注解
  • 原文地址:https://www.cnblogs.com/sola1994/p/3900383.html
Copyright © 2020-2023  润新知