线段树模板1 [Luogu P3372]
代码+注释:
#include <iostream>
#include <cstdio>
using namespace std; int n, q, flag, x, y, v;
int a[];
struct node{
long long a, b;
}tree[]; //树,a为数据域,b为标记 void build_tree(int now, int l, int r) { //建树
if (l == r) {
tree[now].a = a[l]; //填充数据
return ;
}
int mid = (l + r) >> ; //mid = (l + r) div 2; 位运算加速
build_tree(now + now, l, mid); //往左边继续建树
build_tree(now + now + , mid + , r); //往右边继续建树
tree[now].a = tree[now + now].a + tree[now + now + ].a; //此时节点数据域为下接两个节点的和,便于查询
} void plust(int now, int l, int r, int x, int y) {//区间加操作
if ((l == x) && (r == y) || (l == r)) { //达到要求
tree[now].a += v * (r - l + ); //累加v的值与当前节点下所有的节点数的积(若当前节点下没有节点则为1)
tree[now].b += v; //打标记
return ; //回溯
}
int mid = (l + r) >> ;
tree[now + now].b += tree[now].b; //向下传递标记(以下都是)
tree[now + now + ].b += tree[now].b;
tree[now + now].a += (tree[now].b * (mid - l + ));
tree[now + now + ].a += (tree[now].b * (r - mid));
tree[now].b = ; //向下传递标记,当前标记清空(不管怎么样就是这样)
if (y <= mid) plust(now + now, l, mid, x, y);//若操作区间在mid左边,往左边继续操作
else if (x > mid) plust(now + now + , mid + , r, x, y);//若在mid右边,往右边继续操作
else { //否则拆开分别左右操作
plust(now + now, l, mid, x, mid);
plust(now + now + , mid + , r, mid + , y);
}
tree[now].a = tree[now + now].a + tree[now + now + ].a; //更新当前节点的数据
} long long query(int now, int l, int r, int x, int y) { //区间查询
if ((l == x) && (r == y)) return tree[now].a; //若当前节点所代表的区间恰好与需要查询的区间重合,返回值
int mid = (l + r) >> ;
tree[now + now].b += tree[now].b; //同上,向下传递标记(以下都是)
tree[now + now + ].b += tree[now].b;
tree[now + now].a += (tree[now].b * (mid - l + ));
tree[now + now + ].a += (tree[now].b * (r - mid));
tree[now].b = ; //同上,向下传递标记
if (y <= mid) return query(now + now, l, mid, x, y); //查询区间在mid左边,往左边取
else if (x > mid) return query(now + now + , mid + , r, x, y); //否则在右边取
else return query(now + now, l, mid, x, mid) + query(now + now + , mid + , r, mid + , y); //再否则断开从左右边取
} int main() { //主程序
scanf("%d%d", &n, &q); //读入数列的长度和操作的次数
for (int i = ; i <= n; i++)
scanf("%d", &a[i]); build_tree(, , n); //建树 for (int i = ; i <= q; i++) {
scanf("%d%d%d", &flag, &x, &y); //开始
if (flag == ) {
scanf("%d", &v); //v为要加进去的数
plust(, , n, x, y); //区间加操作
continue;
}
printf("%lld\n", query(, , n, x, y)); //否则查询区间
} return ;
}
供个人复习使用
线段树模板1 [Luogu P3372]的更多相关文章
- 洛谷P3372线段树模板1——线段树
题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...
- AC日记——【模板】线段树 1 洛谷 P3372
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...
- 线段树模板(无lazy优化)
区间修改与区间查询问题 模板: int ans; struct node{ int l,r,v; node(){v=;} }tree[LEN*]; int arr[LEN]; //建树 void bu ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- P3373 线段树模板
好,这是一个线段树模板. #include <cstdio> using namespace std; ; long long int sum[N],tag1[N],tag2[N],mo; ...
- 线段树模板hdu 1754:I Hate It
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- UESTC - 1057 秋实大哥与花 线段树模板题
http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...
- POJ 3468 A Simple Problem with Integers(线段树模板之区间增减更新 区间求和查询)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 140120 ...
随机推荐
- P3203 [HNOI2010]弹飞绵羊
LCT裸题,之后填坑打一下 分块做法:每个点存几次出块以及出块的位置,问的时候直接暴力跳就vans了 首先思考最普通的模拟,发现可以O(n)路径压缩,O(1)的查询,但是需要修改就变成了O(n^2)的 ...
- Luogu P2158 仪仗队 题解报告
题目传送门 [题目大意] 给定一个n×n的点方阵,求站在左下角的点能看到的点数 注意同一条直线上只能看到一个点 [思路分析] 因为是一个方阵,所以可以对称地算,那么对于半个方阵,这里假设是左上的半个方 ...
- nginx反向代理配置两个不同服务器
1.什么是反向代理通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Inter ...
- vueSSR全栈(项目实战 mac)
1.准备安装及指定版本 参考安装类中的 安装部分(node,npm,webpack) nuxt 官网下载nuxt脚手架(可以自定义版本) 需要下载MongoDB redis 以及数据库可视化工具 具 ...
- ASP.NET Core学习系列
.NET Core ASP.NET Core ASP.NET Core学习之一 入门简介 ASP.NET Core学习之二 菜鸟踩坑 ASP.NET Core学习之三 NLog日志 ASP.NET C ...
- GCD nyoj 1007 (欧拉函数+欧几里得)
GCD nyoj 1007 (欧拉函数+欧几里得) GCD 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 The greatest common divisor ...
- VMware使两台windows虚拟机能够互相ping通
1.关闭防火墙 cmd命令行里输入:netsh firewall set opmode disable 2.测试如果还不能ping通,就把网络类型选nat类型 3.测试:vmware网关默认是.2
- centOS设置开机自启
原文:https://blog.csdn.net/txz317/article/details/49683439 1.利用 chkconfig 来配置启动级别 在CentOS或者RedHat其他系统下 ...
- 使用requests+pyquery爬取dd373地下城跨五最新商品信息
废话不多说直接上代码: 可以使用openpyel库对爬取的信息写入Execl表格中代码我就不上传了 import requests from urllib.parse import urlencode ...
- 生活日历NABCD需求分析
这次我们团队要开发一个生活日历APP,对于这个APP的NABCD的需求分析,我对此作出其中的一小部分介绍. N(Need)需求 目前市场上有很多的日历程序,每个手机自带的功能中必然有日历程序.但是对于 ...