您的位置:首页 > 其它

poj 3468线段树延迟更新

2014-08-13 00:16 387 查看
这个代码不知道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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: