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;
}
#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;
}
相关文章推荐
- Poj 3468 A Simple Problem with Integers(线段树 区间更新 延迟标记)
- POJ 3468 A Simple Problem with Integers(线段树 + Lazy Tag(延迟更新))
- poj 3468 A Simple Problem with Integers(线段树、延迟更新)
- poj 3468 A Simple Problem with Integers(线段树、延迟更新)
- POJ 3468 (线段树,区间更新,查询区间)
- poj - 3468 - A Simple Problem with Integers(线段树(区间更新))
- poj 3468 A Simple Problem with Integers(线段树成段更新,延迟标记,Lazy)
- POJ 3468 :A Simple Problem with Integers——区间更新线段树经典题目
- poj 3468 线段树区间更新维护
- Poj 3468 A Simple Problem with Integers (线段树 区间更新 区间求和)
- POJ-3468-A Simple Problem with Integers(区间更新,求和)-splay或线段树
- POJ 3468 A Simple Problem with Integers(线段树区间更新,模板题,求区间和)
- POJ-3468-A Simple Problem with Integers(线段树区间更新)
- poj 3468 A Simple Problem with Integers 线段树 区间更新求和
- poj3468区间延迟更新模板题
- 线段树 poj 3468 A Simple Problem with Integers 区间add更新
- [poj 3468]A Simple Problem with Interger[线段树][区间更新]
- POJ-3468(线段树_区间更新)
- 线段树 : 区间更新 poj 3468 示例
- 线段树模板 (poj 3468)延迟标记