//add,懒标记,给以当前节点为根的子树中的每一个点加上add(不包含根节点)
//
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = ;
int n, m;
int w[N];
struct Node
{
int l, r;
//总和
//如果只考虑当前节点及子节点上的标记,当前区间和是多少 ,没考虑所有祖先节点上的标记
LL sum;
//懒标记
//给当前区间的所有儿子加上add
LL add;
}tr[N * ];
//用子节点的信息来计算父节点的信息
void pushup(int u)
{
tr[u].sum = tr[u << ].sum + tr[u << | ].sum;
}
void pushdown(int u)
{
Node &root = tr[u], &left = tr[u << ], &right = tr[u << | ];
//如果当前根节点有标记,往下传,还要清空
if (root.add)
{
left.add += root.add;
left.sum += (LL)(left.r - left.l + ) * root.add;
right.add += root.add;
right.sum += (LL)(right.r - right.l + ) * root.add;
root.add = ;
}
}
void build(int u, int l, int r)
{
if (l == r)
tr[u] = {l, r, w[r], };
else
{
tr[u] = {l, r};
int mid = l + r >> ;
build(u << , l, mid);
build(u << | , mid + , r);
pushup(u);
}
}
void modify(int u, int l, int r, int d)
{
if (tr[u].l >= l && tr[u].r <= r)
{
//总和
tr[u].sum += (LL)(tr[u].r - tr[u].l + ) * d;
//懒标记
tr[u].add += d;
}
// 区间太大,一定要分裂
else
{
pushdown(u);
int mid = tr[u].l + tr[u].r >> ;
if (l <= mid)
modify(u << , l, r, d);
if (r > mid)
modify(u << | , l, r, d);
//当前区间和发生变化,需要向上传
pushup(u);
}
}
LL query(int u, int l, int r)
{
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].sum;
//查询子区间
pushdown(u);
int mid = tr[u].l + tr[u].r >> ;
LL sum = ;
if (l <= mid)
sum = query(u << , l, r);
if (r > mid)
sum += query(u << | , l, r);
return sum;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i ++ )
scanf("%d", &w[i]);
build(, , n);
char op[];
int l, r, d;
while (m -- )
{
scanf("%s%d%d", op, &l, &r);
if (*op == 'C')
{
scanf("%d", &d);
modify(, l, r, d);
}
else printf("%lld\n", query(, l, r));
}
return ;
}

A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询的更多相关文章

  1. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)

    参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...

  2. A Simple Problem with Integers POJ - 3468 (线段树)

    思路:线段树,区间更新,区间查找 #include<iostream> #include<vector> #include<string> #include< ...

  3. A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 69589   ...

  4. POJ 3468 线段树区间修改查询(Java,c++实现)

    POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...

  5. POJ - 3468 线段树区间修改,区间求和

    由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记 ...

  6. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

  7. ACM: A Simple Problem with Integers 解题报告-线段树

    A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & %l ...

  8. [线段树]区间修改&区间查询问题

    区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...

  9. POJ 3468 (线段树 区间增减) A Simple Problem with Integers

    这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...

随机推荐

  1. Go语言实现:【剑指offer】数据流中的中位数

    该题目来源于牛客网<剑指offer>专题. 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位 ...

  2. 使用DIV实现页面的遮罩效果

    Div实现页面的遮罩 之前没动手搞过,项目有个需求刚好可以用到,就想着去试下,结果发现自己都理解的有问题了. 遮罩的实现是使用opacity或者IE下的filter滤镜来设置透明度的,而且一个div必 ...

  3. 详解CopyOnWrite容器及其源码

    详解CopyOnWrite容器及其源码 在jave.util.concurrent包下有这样两个类:CopyOnWriteArrayList和CopyOnWriteArraySet.其中利用到了Cop ...

  4. Linux的那些事-系统启动(增加开机启动项)

    1   /etc/init.d 2   /etc/inittab 3   /etc/rc.d/init.d  1.   /etc/init.d 是一般开机的启动服务存放在这个目录下,至于实现机制,其实 ...

  5. [CentOS7]sed 指定字符前后添加内容

    指定字符前面添加 sed -i 's/指定的字符/需要添加的字符&/' 文件名称 修改Linux启动配置 将 GRUB_CMDLINE_LINUX="rd.lvm.lv=centos ...

  6. linux入门系列14--ssh服务及主机远程管理

    通过前面十余篇文章的介绍,相信已经初步入门Linux本地管理的基本方法了,后续的文章将介绍Linux中常用的服务部署以及如何为外部提供相应的服务. 系列文章第三篇"linux入门系列3--l ...

  7. day1 对java的认识

    对java的认识 1.java是一门跨平台的语言,由jvm进行预编译,转换成类似伪代码一样的东西,最后再转换成机器语言. 2.程序是由数据结构和算法构成,其他所有的工具类,方法都是为数据结构或者算法服 ...

  8. Android埋点方案的简单实现-AOP之AspectJ

    个人博客 http://www.milovetingting.cn Android埋点方案的简单实现-AOP之AspectJ AOP的定义 AOP为Aspect Oriented Programmin ...

  9. 关于使用kms时遇到的there is nothing to do here

    我讲一下我自己的解决方法 ------------------------------------ 这个错误还是很明显的,没事干,如果不是kms的锅的话,那么就是字面上的问题了 ----------- ...

  10. 苹果Mac电脑永久路由的添加 & Mac 校园网连接教程

    学校校园网面向全校师生开放,无奈Windows用户基数大,学校只为Windows平台制作了内网连接工具,Mac平台资源较少,本人查阅相关资料后,总结整理出以下步骤,方便本校学生连接校园网.有永久路由添 ...