kb-07线段树-03--区间修改查询--lazy思想
2024-09-02 21:17:20
/*
区间修改,区间查询和;
第一次使用lazy思想;
poj3468
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
typedef struct
{
int l,r;
ll add;
ll value;
}V; int n,m,a[]={}; V tr[]={};
void Pushup(int rt)
{
tr[rt].value=tr[rt<<].value+tr[(rt<<)|].value;
}
void Pushdown(int rt,int m)
{
if(tr[rt].add)
{
tr[rt<<].add+=tr[rt].add;
tr[(rt<<)|].add+=tr[rt].add;
tr[rt<<].value+=tr[rt].add*(m-(m>>));
tr[(rt<<)|].value+=tr[rt].add*(m>>);
tr[rt].add=;
}
}
void build(int i,int l,int r)
{
tr[i].l=l;
tr[i].r=r;
tr[i].add=;
if(l==r)
{
tr[i].value=a[l];
return ;
}
int mid=(l+r)/;
build(i<<,l,mid);
build((i<<)|,mid+,r);
Pushup(i);
}
void Update(int i,int l,int r,int x)
{
if(tr[i].l==l&&tr[i].r==r)
{
tr[i].add+=x;
tr[i].value+=(ll)x*(r-l+);
return ;
}
if(tr[i].l==tr[i].r)
return ;
Pushdown(i,tr[i].r-tr[i].l+);
int t=i<<;
if(l<=tr[t].r)
{
if(r<=tr[t].r)
Update(t,l,r,x);
else
Update(t,l,tr[t].r,x);
}
t+=;
if(r>=tr[t].l)
{
if(l>=tr[t].l)
Update(t,l,r,x);
else
Update(t,tr[t].l,r,x);
}
Pushup(i);
}
ll Query(int i,int l,int r)
{
if(tr[i].l==l&&tr[i].r==r)
{
return tr[i].value;
}
Pushdown(i,tr[i].r-tr[i].l+);
ll ans=;
i=i<<;
if(l<=tr[i].r)
{
if(r<=tr[i].r)
ans+=Query(i,l,r);
else
ans+=Query(i,l,tr[i].r);
}
i+=;
if(r>=tr[i].l)
{
if(l>=tr[i].l)
ans+=Query(i,l,r);
else
ans+=Query(i,tr[i].l,r);
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,,sizeof(a));
memset(tr,,sizeof(tr));
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,,n);
for(int i=;i<m;i++)
{
char s[];
int x1,x2,x3;
scanf("%s",s);
if(s[]=='C')
{
scanf("%d%d%d",&x1,&x2,&x3);
Update(,x1,x2,x3);
}
else
{
scanf("%d%d",&x1,&x2);
printf("%I64d\n",Query(,x1,x2));
}
}
}
return ;
}
最新文章
- Oracle数据库的 增、删、改、查
- NSString方法与NSMutableString方法
- 实现跨云应用——基于DNS的负载均衡
- phpexcel生成excel并下载
- Flume 实战(1) -- 初体验
- ecshop的Mysql操作类
- [LeetCode]题解(python):039-Combination Sum
- daatable动态创建
- HDU2699+Easy
- oc对象互相引用内存释放解决方案
- 配置日志logwarch 每天发送到邮箱
- Echarts后台封装option对象
- [Swift]LeetCode989. 数组形式的整数加法 | Add to Array-Form of Integer
- Scoop及使用
- loadrunner录制的时候如何应对验证码的问题解决办法?
- 查看mysql执行的线程,并杀掉他
- 建议使用nginx配合uwsgi,
- 图像处理之CSC色彩转换
- ajax操作的链式写法
- swing版网络爬虫-丑牛迷你采集器2.0
热门文章
- 机器学习&;深度学习资料分享
- 2018.4.1 Ubuntu16.04 下配置Tomcat服务器以及设置dingshi启动
- Android layout的XML
- 修改Windows默认调试器
- PAT (Basic Level) Practise (中文)- 1008. 数组元素循环右移问题 (20)
- java基础—抽象类介绍
- python从列表中删除相邻重复元素
- 09GNU C语言程序编译
- python入门:while循环里面True和False的作用,真和假
- 无需上传附件到服务器,Servlet读取Excel(二)