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 敌兵布阵的主要内容,如果未能解决你的问题,请参考以下文章