poj3468

来源:互联网 发布:windows编译php 编辑:程序博客网 时间:2024/05/29 09:40

 这是我敲的第一道线段树的题目,第一次就让我做这么难的题目还让不让我活了,==。。。泪奔

题目的大意就通过一些操作变换,成段更新,问一段的和。

线段树操作其实蛮麻烦的额。。。

总用有几个

1.pushup()将子节点加到父亲节点上去;

2.pushdown()将父亲的节点的lazy标记下传到子节点中;

3.build()建树;

4.modify()成段跟新;

5.query()询问一段的和;

贴上一段代码:

#include <iostream>#include <stdio.h>#include <string.h>#define ls (p<<1)#define rs ((ls)+1)#define mid ((t[p].l+t[p].r)>>1)using namespace std;const int maxn=200010;struct Tree{    int l;    int r;    long long sum;    long long lazy;}t[maxn<<2];int v[maxn];void pushdown(int p){    if(t[p].lazy)    {        t[ls].lazy+=t[p].lazy;        t[rs].lazy+=t[p].lazy;        t[ls].sum+=t[p].lazy*(t[ls].r-t[ls].l+1);        t[rs].sum+=t[p].lazy*(t[rs].r-t[rs].l+1);        t[p].lazy=0;    }}void pushup(int p){    t[p].sum=t[ls].sum+t[rs].sum;}void build(int p,int l,int r){    t[p].l=l;t[p].r=r;    t[p].lazy=0;    if(l==r)    {        t[p].sum=v[l];        return ;    }else{    build(ls,l,mid);        build(rs,mid+1,r);        pushup(p);}}void modify(int p,int l,int r,int val){    if(t[p].l==l&&t[p].r==r)    {        t[p].lazy+=val;        t[p].sum+=val*(t[p].r-t[p].l+1);        return ;    }    pushdown(p);    if(r<=mid)    {        modify(ls,l,r,val);    }    else if(l>mid)    {        modify(rs,l,r,val);    }    else    {        modify(ls,l,mid,val);        modify(rs,mid+1,r,val);    }    pushup(p);}long long query(int p,int l,int r){    if(t[p].l==l&&t[p].r==r)    {        return t[p].sum;    }    pushdown(p);    if(mid>=r)       return  query(ls,l,r);    else if(mid<l)        return query(rs,l,r);    else return query(ls,l,mid)+query(rs,mid+1,r);}int main(){    freopen("in.txt","r",stdin);    int n,q,i;    scanf("%d%d",&n,&q);    char str[2];    for(i=1;i<=n;i++)    {        scanf("%d",&v[i]);    }    build(1,1,n);    int x,y,c;    for(i=1;i<=q;i++)    {        scanf("%s%d%d",str,&x,&y);        if(str[0]=='Q')        {            printf("%I64d\n",query(1,x,y));        }        else        {        scanf("%d",&c);        modify(1,x,y,c);        }    }    return 0;}


  

0 0