POJ 3468 A Simple Problem with Integers
2018-03-28 10:59
344 查看
HDU 3468
#include<cstdio>
using namespace std;
long long tree[400010],lazy[400010];
long long build(int node,int l,int r){
if(l==r)scanf("%lld",&tree[node]);
else{
int mid=(l+r)/2;
tree[node]=build(node*2,l,mid)+build(node*2+1,mid+1,r);
}
return tree[node];
}
void add(int node,int L,int R,int l,int r,long long ad){
if(L>=l&&R<=r){
tree[node]+=(long long)(R-L+1)*ad;
lazy[node]+=ad;
return;
}
int mid=(L+R)/2;
if(lazy[node]){
tree[node*2]+=(long long)(mid-L+1)*lazy[node];
tree[node*2+1]+=(long long)(R-mid)*lazy[node];
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
if(mid>=r)add(node*2,L,mid,l,r,ad);
else if(mid<l)add(node*2+1,mid+1,R,l,r,ad);
else{
add(node*2,L,mid,l,r,ad);
add(node*2+1,mid+1,R,l,r,ad);
}
tree[node]=tree[node*2]+tree[node*2+1];
}
long long query(int node,int L,int R,int l,int r){
if(L>=l&&R<=r)return tree[node];
int mid=(L+R)/2;
if(lazy[node]){
tree[node*2]+=(long long)(mid-L+1)*lazy[node];
tree[node*2+1]+=(long long)(R-mid)*lazy[node];
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
if(mid>=r)return query(node*2,L,mid,l,r);
else if(mid<l)return query(node*2+1,mid+1,R,l,r);
return query(node*2,L,mid,l,r)+query(node*2+1,mid+1,R,l,r);
}
int main(){
long long z;
int n,q,i,x,y;
char c;
scanf("%d%d",&n,&q);
build(1,1,n);
for(i=1;i<=q;i++){
scanf("\n%c %d%d",&c,&x,&y);
if(c=='C'){
scanf("%lld",&z);
add(1,1,n,x,y,z);
}
else printf("%lld\n",query(1,1,n,x,y));
}
return 0;
}
#include<cstdio>
using namespace std;
long long tree[400010],lazy[400010];
long long build(int node,int l,int r){
if(l==r)scanf("%lld",&tree[node]);
else{
int mid=(l+r)/2;
tree[node]=build(node*2,l,mid)+build(node*2+1,mid+1,r);
}
return tree[node];
}
void add(int node,int L,int R,int l,int r,long long ad){
if(L>=l&&R<=r){
tree[node]+=(long long)(R-L+1)*ad;
lazy[node]+=ad;
return;
}
int mid=(L+R)/2;
if(lazy[node]){
tree[node*2]+=(long long)(mid-L+1)*lazy[node];
tree[node*2+1]+=(long long)(R-mid)*lazy[node];
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
if(mid>=r)add(node*2,L,mid,l,r,ad);
else if(mid<l)add(node*2+1,mid+1,R,l,r,ad);
else{
add(node*2,L,mid,l,r,ad);
add(node*2+1,mid+1,R,l,r,ad);
}
tree[node]=tree[node*2]+tree[node*2+1];
}
long long query(int node,int L,int R,int l,int r){
if(L>=l&&R<=r)return tree[node];
int mid=(L+R)/2;
if(lazy[node]){
tree[node*2]+=(long long)(mid-L+1)*lazy[node];
tree[node*2+1]+=(long long)(R-mid)*lazy[node];
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
if(mid>=r)return query(node*2,L,mid,l,r);
else if(mid<l)return query(node*2+1,mid+1,R,l,r);
return query(node*2,L,mid,l,r)+query(node*2+1,mid+1,R,l,r);
}
int main(){
long long z;
int n,q,i,x,y;
char c;
scanf("%d%d",&n,&q);
build(1,1,n);
for(i=1;i<=q;i++){
scanf("\n%c %d%d",&c,&x,&y);
if(c=='C'){
scanf("%lld",&z);
add(1,1,n,x,y,z);
}
else printf("%lld\n",query(1,1,n,x,y));
}
return 0;
}
相关文章推荐
- POJ 3468 A Simple Problem with Integers (区间增减)
- POJ 3468 A Simple Problem with Integers (线段树成段更新) 解题报告
- POJ 3468 A Simple Problem with Integers-利用lzy进行区间更新的线段树
- POJ 3468 A Simple Problem with Integers 【线段树】
- poj 3468 A Simple Problem with Integers
- poj - 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers
- [线段树] POJ 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers 线段树成段更新
- POJ--3468 -- A Simple Problem with Integers [线段树]
- poj 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers
- POJ 3468 A Simple Problem with Integers
- poj 3468 A Simple Problem with Integers
- POJ 3468 – A Simple Problem with Integers
- [线段树] POJ 3468 - A Simple Problem with Integers
- G - A Simple Problem with Integers POJ - 3468
- poj 3468 A Simple Problem with Integers(线段树,区间更新&求和)
- poj 3468 A Simple Problem with Integers
- poj 3468 A Simple Problem with Integers