POJ 3468 A Simple Problem with Integers (线段树多点更新模板)
2024-09-07 10:42:40
题意:
给定一个区间, 每个区间有一个初值, 然后给出Q个操作, C a b c是给[a,b]中每个数加上c, Q a b 是查询[a,b]的和
代码:
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = + ;
struct{
long long val, addMark;
}segTree[maxn << ];
long long a[maxn];
int n , m;
void build(int root, int l, int r){
segTree[root].addMark = ; if(l == r){
segTree[root].val = a[l];
return;//记得return
}
int mid = (l+r) >> ;
build(root*, l,mid);
build(root*+, mid + , r);
segTree[root].val = segTree[root*].val + segTree[root*+].val; //回溯时候更新root
}
void push_down(int root,int L, int R){//传入L, R是为了计算左右子树的和, 分别是(mid - L + 1)、(R-mid)
if(segTree[root].addMark != ){
int mid = L + R >> ;
segTree[root*].addMark += segTree[root].addMark;
segTree[root*+].addMark += segTree[root].addMark; segTree[root*].val += segTree[root].addMark * (mid - L + );
segTree[root*+].val += segTree[root].addMark * (R-mid); segTree[root].addMark = ;
}
}
long long query(int root, int L, int R, int QL, int QR){
if(L > QR || R < QL) return ; if(QL <= L && QR >= R) {
return segTree[root].val;
}
push_down(root,L,R);//如果要向下计算记得先pushdown
int mid = L + R >> ;
return query(root*,L,mid,QL,QR) + query(root*+,mid+,R,QL,QR);
}
void update(int root, int L ,int R, int QL, int QR, int val){
if(L > QR || R < QL) return; if(QL <= L && QR >= R){ segTree[root].val += val * (R-L+);
segTree[root].addMark += val;
return;
} push_down(root,L,R);//如果要向下计算记得先pushdown
int mid = L + R >> ;
update(root*, L, mid, QL , QR , val);
update(root*+,mid+, R, QL,QR,val);
segTree[root].val = segTree[root*].val + segTree[root*+].val;//回溯更新root
}
int main()
{
// freopen("1.txt","r", stdin);
while(~scanf("%d %d", &n , &m)){
memset(segTree,,sizeof(segTree)); for(int i = ; i <= n; i++){
scanf("%lld", &a[i]);
}
build(,,n);
while(m--){
char cho[];
scanf("%s", cho);
int x, y;
scanf("%d %d", &x, &y);
if(cho[] == 'C'){
int v;
scanf("%d", &v);
update(,,n,x,y,v);
}
else{
printf("%lld\n",query(,,n,x,y));
}
}
}
}
最新文章
- tyvj1191 迎春舞会之三人组舞
- springmvc对同名参数处理-我们到底能走多远系列(44)
- git ignore 添加忽略文件不生效解决办法
- oracle 10g在redhat5下的安装
- leetcode98 Validate Binary Search Tree
- tcpproxy:基于 Swoole 实现的 TCP 数据包转发工具的方法
- Sharepoint 2013 系列篇(安装部署)--上篇
- 计算机视觉和人工智能的状态:我们已经走得很远了 The state of Computer Vision and AI: we are really, really far away.
- 简单风格 在线音乐播放器(支持wav,MP3等)
- [原]Unity3D深入浅出 - 认识开发环境中的GameObject菜单栏
- 关于Spring的IOC和DI
- 【HDOJ】2255 奔小康赚大钱
- Json解析要点
- Tessnet2图片识别
- Springboot整合Websocket遇到的坑
- VUE通过id从列表页跳转到相对的详情页
- 模糊查询sql语句条件是中文在后台从数据库查不到结果,是英文和字母就可以,而且统一编码为UTF-8了!!!
- Spark记录-SparkSQL远程操作MySQL和ORACLE
- 依赖注入的方式测试ArrayList和LinkedList的效率(对依赖注入的再次理解)
- C#学习笔记(15)——c#接口
热门文章
- 项目上线后出现Bug,该如何处理?
- 素数+map BestCoder Round #54 (div.2) 1002 The Factor
- 第03课 在VMwave 14.0 上配置企业级CentOS 6.6操作系统
- EOJ Monthly
- POM报错Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 from
- Appium + Python自动化 - 元素定位uiautomatorviewer
- DOCTYPE详解
- 《Python基础教程》 读书笔记 第五章(上)条件语句
- ZIP解压缩文件的工具类【支持多级目录|全】
- C# 移动开发(Xamarin.Form) Plugin.BLE 蓝牙连接