kb-07线段树-03--区间修改查询--lazy思想
/*
区间修改,区间查询和;
第一次使用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 ;
}
kb-07线段树-03--区间修改查询--lazy思想的更多相关文章
- hiho一下20周 线段树的区间修改
线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题改了改,又出给了 ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- hihoCode 1078 : 线段树的区间修改
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
#1078 : 线段树的区间修改 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 对于小Ho表现出的对线段树的理解,小Hi表示挺满意的,但是满意就够了么?于是小Hi将问题 ...
- HDU1698 线段树入门之区间修改/查询(lazy标记法)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)
补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...
- hiho一下21周 线段树的区间修改 离散化
离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho ...
- UVa 11992 Fast Matrix Operations (线段树,区间修改)
题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...
- HDU 1698 【线段树,区间修改 + 维护区间和】
题目链接 HDU 1698 Problem Description: In the game of DotA, Pudge’s meat hook is actually the most horri ...
随机推荐
- python基础教程总结4—基本语句
一.print 和 import 的更多信息 print 打印多个表达式也是可行的,只要将它们用逗号隔开就好: >>> print('Age:' , 42) Age: 42 可以看到 ...
- ABAP的Package interface, 安卓的manifest.xml和Kubernetes的Capabilities
ABAP 事务码SE21创建ABAP包接口.这是ABAP基于包层面的访问控制实现逻辑.包里可以存储很多ABAP对象.如果开发人员想将某些对象声明为包外程序也能访问,可以将这些对象放在包接口的Visib ...
- HDU 5095 Linearization of the kernel functions in SVM (坑水)
比较坑的水题,首项前面的符号,-1,+1,只有数字项的时候要输出0. 感受一下这些数据 160 0 0 0 0 0 0 0 0 -10 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 ...
- [torch] torch.contiguous
torch.contiguous 作用 连续存储,因为view的操作要求的是连续的内容. 详细 考虑下面的操作,transpose操作只是改变了stride,而实际数组存储的内容并没有得到任何改变,即 ...
- JavaScript BOM DOM 对象
title: JavaScript BOM DOM 对象 tags: JavaScript --- browser object model document onject model BOM对象 w ...
- 01_8_Struts用DomainModel接收参数
01_8_Struts用DomainModel接收参数 1. 配置struts.xml文件 <package name="user" namespace="/use ...
- cocos2dx 单张图片加密
cocos2dx 已经封装好读取加密的prv文件的方法,打开texturepacker,导入一张图片,在content protection中写入密钥,在texture format中选择prv格式 ...
- JAVA实现webSocket网页聊天室
一.什么是webSocket WebSocket 是一种网络通信协议,是持久化协议.RFC6455 定义了它的通信标准. WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全 ...
- Codevs1081 线段树练习 2
题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n ...
- 【php】对象的比较
对象的比较 相等的比较 ==当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等. 全等的比较 ===如果 ...