poj3468A Simple Problem with Integers(线段树的区域更新)
http://poj.org/problem?id=3468
真心觉得这题坑死我了,一直错,怎么改也没戏,最后tjj把q[rt].lz改成了long long 就对了,真心坑啊。
线段树的区域更新。
线段树功能:update:成段增减 query:区间求和
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace std; #define N 100002 struct node { int l,r; long long lz,w; }q[4*N]; void pushup(int rt) { q[rt].w=q[rt*2].w+q[rt*2+1].w; } void pushdown(int rt,int m) { if(q[rt].lz) { q[rt*2].lz+=q[rt].lz; q[rt*2+1].lz+=q[rt].lz; q[rt*2].w+=(m-m/2)*q[rt].lz; q[rt*2+1].w+=(m/2)*q[rt].lz; q[rt].lz=0; } } void build(int l,int r,int rt) { q[rt].l=l; q[rt].r=r; q[rt].lz=0; q[rt].w=0; if(l==r) { scanf("%lld",&q[rt].w); return ; } build(l,(r+l)/2,rt*2); build((r+l)/2+1,r,rt*2+1); pushup(rt); } void update(int key,int ll,int rr,int l,int r,int rt) { if(ll<=l&&rr>=r) { q[rt].w+=(long long)key*(r-l+1); q[rt].lz+=key; return ; } pushdown(rt,r-l+1); int m=(r+l)/2; if(ll<=m) update(key,ll,rr,l,m,rt*2); if(rr>m) { update(key,ll,rr,m+1,r,rt*2+1); } pushup(rt); } long long query(int ll,int rr,int l,int r,int rt) { if(ll<=l&&rr>=r) { return q[rt].w; } pushdown(rt,r-l+1); int m=(r+l)/2; long long L=0; if(ll<=m) L+=query(ll,rr,l,m,rt*2); if(rr>m) L+=query(ll,rr,m+1,r,rt*2+1); return L; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { build(1,n,1); while(m--) { char op[10]; int a , b , c; scanf("%s",op); if (op[0] == 'Q') { scanf("%d%d",&a,&b); long long tt=query(a,b,1,n,1); printf("%lld\n",tt); } else if(op[0]=='C') { scanf("%d%d%d",&a,&b,&c); update(c,a,b,1,n,1); } } } return 0; }
感觉这个博客不错http://www.douban.com/note/273509745/