首页 > 代码库 > poj 3468
poj 3468
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 100005
#define LC(x) ((x) << 1)
#define RC(x) ((x) << 1 | 1)
#define Mid(x,y) (((x) + (y)) >> 1)
#define Min(a,b) ((a) < (b) ? (a) : (b))
#define Max(a,b) ((a) > (b) ? (a) : (b))
long long int sum[MAXN<<2],dlt[MAXN<<2];
int lft[MAXN<<2],rht[MAXN<<2];
long long int init_v[MAXN+10];
using namespace std;
void pushdown(int rt){
if(dlt[rt]){
dlt[LC(rt)]+=dlt[rt];
sum[LC(rt)]+=(rht[LC(rt)]-lft[LC(rt)]+1)*dlt[rt]; //width*height
dlt[RC(rt)]+=dlt[rt];
sum[RC(rt)]+=(rht[RC(rt)]-lft[RC(rt)]+1)*dlt[rt];
dlt[rt]=0;
}
}
void pushup(int rt){
sum[rt] = sum[LC(rt)] + sum[RC(rt)];
}
void update(int rt,int start,int end,long long int delta)
{
if(start<=lft[rt]&&end>=rht[rt]){
dlt[rt]+=delta;
sum[rt] += (rht[rt]-lft[rt]+1)*delta;
return;
}
pushdown(rt);// 顺便将之前未更新到儿子的信息pushdown
if(start<=rht[LC(rt)]) update(LC(rt),start,end,delta); //要更新的区间和左儿子有交集(区间左界<=左儿子右界)
if(end>=lft[RC(rt)]) update(RC(rt),start,end,delta); //要更新的区间和右儿子有交集
pushup(rt);//返回时候更新当前节点
}
void build(int rt,int l,int r)
{
lft[rt]=l;
rht[rt]=r;
dlt[rt]=0;
if(l==r){
sum[rt]=init_v[l];
return;
}
else{
build(LC(rt),l,Mid(l,r));
build(RC(rt),Mid(l,r)+1,r);
pushup(rt);
return;
}
}
long long int query(int rt,int start,int end)
{
if(start>rht[rt]||end<lft[rt]) return 0;
//如果当前节点在查询的范围内就直接返回
if(start<=lft[rt]&&end>=rht[rt])
return sum[rt];
pushdown(rt);//顺便更新之前的标记
// if(start>=lft[RC(rt)]) //区间只和右儿子有交集 区间左界大于等于右儿子左界
// return query(RC(rt),start,end);
// else
// if(end<=rht[LC(rt)]) //区间只和左儿子有集交
// return query(LC(rt),start,end);
// else //左右儿子都有交集
return query(LC(rt),start,end) + query(RC(rt),start,end);
}
int main(int argc, char *argv[])
{
int n,q,i,j,start,end;
long long int delta;
char ch[2];
while(scanf("%d%d",&n,&q)!=EOF)
{
for(i=1;i<=n;i++) scanf("%lld",init_v+i);
build(1,1,n);
while(q--)
{
scanf("%s",ch);
if(ch[0]==‘C‘)
{
scanf("%d%d%lld",&start,&end,&delta);
update(1,start,end,delta);
}
else
{
scanf("%d%d",&start,&end);
printf("%lld\n",query(1,start,end));
}
}
return 0;
}
}
来自为知笔记(Wiz)
附件列表
poj 3468
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。