HDU 1166 敌兵布阵

Posted ezsyshx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1166 敌兵布阵相关的知识,希望对你有一定的参考价值。

传送门:HDU 1166 敌兵布阵
算法分析:线段树模板,注意读入处理
---

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxN 100000
#define mid ((l+r)>>1)
#define ls k<<1
#define rs k<<1 | 1
using namespace std;
typedef long long ll;
ll sum[4*maxN+1],v[4*maxN+1];
void pushup(int);
void update(int,int,int,int,int,int);
void pushdown(int,int,int);
ll query(int,int,int,int,int);
void build(int,int,int);
int n,x,y,t;
char s[6];
void task(int);
int main()
{
    scanf("%d",&t);
    for(int i=1;i<=t;i++) task(i);
    return 0;
}
void task(int cas)
{
    memset(sum,0,sizeof(sum));
    memset(v,0,sizeof(v));
    scanf("%d",&n); build(1,1,n);
    printf("Case %d:
",cas);
    while(true)
    {
        scanf("%s",s);
        if(!strcmp(s,"End")) break;
        scanf("%d%d",&x,&y);
        if(!strcmp(s,"Query")) printf("%lld
",query(1,1,n,x,y));
        if(!strcmp(s,"Add")) update(1,1,n,x,x,y);
        if(!strcmp(s,"Sub")) update(1,1,n,x,x,-y);
    }
}
void pushup(int k) {sum[k]=sum[ls]+sum[rs];}
void update(int k,int l,int r,int ql,int qr,int u)
{
    if(ql<=l && r<=qr)
    {
        sum[k]+=u*(r-l+1);
        v[k]+=u; return;
    }
    if(v[k]) pushdown(k,l,r);
    if(ql<=mid) update(ls,l,mid,ql,qr,u);
    if(qr>mid) update(rs,mid+1,r,ql,qr,u);
    pushup(k);
}
ll query(int k,int l,int r,int ql,int qr)
{
    if(ql<=l && r<=qr) return sum[k];
    if(v[k]) pushdown(k,l,r);
    long long ans=0;
    if(ql<=mid) ans+=query(ls,l,mid,ql,qr);
    if(qr>mid) ans+=query(rs,mid+1,r,ql,qr);
    return ans;
}
void build(int k,int l,int r)
{
    if(l==r) {scanf("%lld",&sum[k]); return;}
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(k);
}
void pushdown(int k,int l,int r)
{
    v[ls]+=v[k]; v[rs]+=v[k];
    sum[ls]+=(mid-l+1)*v[k];
    sum[rs]+=(r-mid)*v[k];
    v[k]=0;
}


以上是关于HDU 1166 敌兵布阵的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1166 敌兵布阵

[HDU 1166]敌兵布阵

hdu 1166 敌兵布阵

HDU 1166 敌兵布阵

HDU 1166 敌兵布阵(线段树)

HDU 1166 敌兵布阵 (树状数组)