poj 3468线段树延迟更新

来源:互联网 发布:写漫画的软件 编辑:程序博客网 时间:2024/05/29 17:48

这个代码不知道ADO为什么WA,好伤心

#include<iostream>

#include<cmath>
#include<cstring>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<string>
#include<stack>
#include<queue>
#include<map>
typedef long long LL;
const int MAX=0xfffffff;
using namespace std;
const int mx=100010;
class node {
public:
    int l,r,add;
    LL sum;
}tree[mx*4];
int num[mx];
LL ans;
void pushup(int v)
{
    tree[v].sum=tree[v<<1].sum+tree[v<<1|1].sum;
}
void pushdown(int v,int a)
{
    if(tree[v].add)
    {
        tree[v<<1].add+=tree[v].add;
        tree[v<<1|1].add+=tree[v].add;
        tree[v<<1].sum+=LL(a-(a>>1))*tree[v<<1].add;
        tree[v<<1|1].sum+=LL(a>>1)*tree[v<<1|1].add;
        tree[v].add=0;
    }
}
void build(int v,int l,int r)
{
    tree[v].l=l,tree[v].r=r,tree[v].add=0;
    if(l==r)
    {
        tree[v].sum=num[l];
        return;
    }
    int mid=(l+r)>>1;
    build(v<<1,l,mid),build(v<<1|1,mid+1,r);
    pushup(v);
}
void update(int v,int l,int r,int z)
{
    if(l<=tree[v].l&&r>=tree[v].r)
    {
        tree[v].add+=z;
        tree[v].sum+=LL(tree[v].r-tree[v].l+1)*z;
        return;
    }
    pushdown(1,tree[v].r-tree[v].l+1);
    int mid=(tree[v].l+tree[v].r)/2;
    if(l<=mid)  update(v<<1,l,r,z);
    if(r>mid)  update(v<<1|1,l,r,z);
    pushup(v);
}
void query(int v,int l,int r)
{
    if(l<=tree[v].l&&tree[v].r<=r)
    {
        ans+=tree[v].sum;
        return;
    }
    pushdown(v,tree[v].r-tree[v].l+1);
    int mid=(tree[v].l+tree[v].r)/2;
    if(l<=mid)  query(v<<1,l,r);
    if(r>mid)  query(v<<1|1,l,r);
}
int main( )
{
    //freopen("1.txt","r",stdin);
    int n,q;
    while(scanf("%d%d",&n,&q)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        build(1,1,n);
        while(q--)
        {
            getchar( );
            char c;
            int a,b,d;
            scanf("%c",&c);
            if(c=='C')
            {
                scanf("%d%d%d",&a,&b,&d);
                update(1,a,b,d);
            }
            else if(c=='Q')
            {
                scanf("%d%d",&a,&b);
                ans=0;
                query(1,a,b);
                printf("%lld\n",ans);
            }
        }
    }
    return 0;
}
0 0
原创粉丝点击