POJ3468(线段树成段增加)
2016-07-23 19:50
337 查看
题目链接
大牛博客链接
ac代码:
大牛博客链接
ac代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=100000+5; typedef long long ll; struct tree { ll l,r,sum,inc; }a[maxn*4]; ll c[maxn]; void build(ll o,ll l,ll r) //初始建树 { a[o].l=l,a[o].r=r,a[o].inc=0; if(l==r) { a[o].sum=c[l]; return; } else { ll m=(l+r)/2; build(o*2,l,m); build(o*2+1,m+1,r); a[o].sum=a[o*2].sum+a[o*2+1].sum; return; } } void add(ll o,ll p,ll q,ll v) //对区间[p,q] 上的每个点增加v { if(a[o].l==p&&a[o].r==q) { a[o].inc+=v; return; } a[o].sum+=v*(q-p+1); ll m=(a[o].l+a[o].r)/2; if(q<=m) add(o*2,p,q,v); else if(p>m) add(o*2+1,p,q,v); else { add(o*2,p,m,v); add(o*2+1,m+1,q,v); } return; } ll query(ll o,ll p,ll q) //查询区间[p,q]的和 { if(a[o].l==p&&a[o].r==q) { return a[o].sum+(q-p+1)*a[o].inc; } a[o].sum+=(a[o].r-a[o].l+1)*a[o].inc; //将标记向下推 int m=(a[o].l+a[o].r)/2; add(o*2,a[o].l,m,a[o].inc); add(o*2+1,m+1,a[o].r,a[o].inc); a[o].inc=0; if(q<=m) return query(o*2,p,q); else if(p>m) return query(o*2+1,p,q); else return query(o*2,p,m)+query(o*2+1,m+1,q); } int main() { ll n,q; scanf("%I64d%I64d",&n,&q); for(int i=1;i<=n;i++) scanf("%I64d",&c[i]); build(1,1,n); char ch; for(int i=1;i<=q;i++) { cin >> ch; if(ch=='Q') { ll p,q; scanf("%I64d%I64d",&p,&q); printf("%I64d\n",query(1,p,q)); } else if(ch=='C') { ll a,b,v; scanf("%I64d%I64d%I64d",&a,&b,&v); add(1,a,b,v); } } }
相关文章推荐
- hdu 5730(分治FFT)
- svn1
- 结构体和方法
- 【bzoj2462】[BeiJing2011]矩阵模板
- HDU 1863 畅通工程
- cocoapods的安装和使用 总结
- LeetCode[368] Largest Divisible Subset
- CodeForces 427A Police Recruits
- 杭电ACM--HDU-2053a/b+c/d和HDU-2504又见gcd
- poj1611 简单并查集
- 【bzoj4320】ShangHai2006 Homework
- 《计算机图形学》学习笔记 0
- java值传递,引用传递
- phpwind house2.3房产建站笔记
- Bestcoder-Aaronson
- POJ 2975 Nim <Nim 博弈>
- java-基础-异常
- Codeforces Round #364 (Div. 2) B. Cells Not Under Attack 标记数组
- 【bzoj1303】[CQOI2009]中位数图
- 数字图像处理------中值滤波