A Simple Problem with Integers POJ - 3468 线段树区间修改+区间查询
//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 线段树区间修改+区间查询的更多相关文章
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- A Simple Problem with Integers POJ - 3468 (线段树)
思路:线段树,区间更新,区间查找 #include<iostream> #include<vector> #include<string> #include< ...
- A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 69589 ...
- POJ 3468 线段树区间修改查询(Java,c++实现)
POJ 3468 (Java,c++实现) Java import java.io.*; import java.util.*; public class Main { static int n, m ...
- POJ - 3468 线段树区间修改,区间求和
由于是区间求和,因此我们在更新某个节点的时候,需要往上更新节点信息,也就有了tree[root].val=tree[L(root)].val+tree[R(root)].val; 但是我们为了把懒标记 ...
- poj 2528 线段树区间修改+离散化
Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...
- ACM: A Simple Problem with Integers 解题报告-线段树
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & %l ...
- [线段树]区间修改&区间查询问题
区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
随机推荐
- Go语言实现:【剑指offer】字符串的排列
该题目来源于牛客网<剑指offer>专题. 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,b ...
- gridFS-Nginx的安装与使用
在使用gridFs的nginx模块时,先确认好你的机器上已经安装好了mongo 首先通过git将最新的gridfs的nginx模块下载到本地 git clone https://github.com/ ...
- Liunx 上安装java
linux系统的基本指令 http://www.cnblogs.com/sxdcgaq8080/p/7470796.html ===================================== ...
- [redis读书笔记] 第二部分 sentinel
1.sentinel的初始化,会制定master的IP和port,然后sentinel会创建向被监视主服务器的命令连接和订阅连接: - 命令连接是用来和主服务器之间进行命令通信的 - 订阅连接,用于 ...
- k8s系列---ingress资源和ingress-controller
https://www.cnblogs.com/zhangeamon/p/7007076.html http://blog.itpub.net/28916011/viewspace-2214747/ ...
- Zookeeper 部署 配置文件
Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式: Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是 ...
- Ubuntu14.04安装tomcat-9.0.1的教程
系统环境:Ubuntu14.04 Tomcat安装版本:Apache tomcat 9.0.1 下载地址:http://tomcat.apache.org/download-90.cgi 安装包:ap ...
- Bookshelf 2 01背包
B - Bookshelf 2 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submi ...
- C语言三(2)
多重 if...else....else 结构 语法: if(条件1) { 语句1; } else if(条件2) { 语句2; } else if(条件3) { 语句3; } else { 语句N; ...
- Swift 枚举-从汇编角度看枚举内存结构
一.基本使用 先看枚举的几种使用(暂不要问,看看是否都能看懂,待会会逐一讲解) 1.操作一 简单使用 //第一种方式 enum Direction { case east case west case ...