洛谷P3372线段树模板1——线段树
题目:https://www.luogu.org/problemnew/show/P3372
线段树模板。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,a[100005],ct;
struct N{
long long lazy,sum;
long long ls,rs;
}p[200005];
void pushdown(long long cur,long long l,long long r)
{
long long mid=(l+r)/2;
long long lson=p[cur].ls,rson=p[cur].rs;
p[lson].lazy+=p[cur].lazy;
p[rson].lazy+=p[cur].lazy;
p[lson].sum+=p[cur].lazy*(mid-l+1);
p[rson].sum+=p[cur].lazy*(r-mid);
p[cur].lazy=0;
}
void pushup(long long cur)
{
long long lson=p[cur].ls,rson=p[cur].rs;
p[cur].sum=p[lson].sum+p[rson].sum;
}
void build(long long l,long long r,long long cur)
{
if(l==r)
{
p[cur].sum=a[l];
p[cur].ls=-1;p[cur].rs=-1;
return;
}
long long mid=(l+r)/2;
p[cur].ls=++ct;p[cur].rs=++ct;
build(l,mid,p[cur].ls);build(mid+1,r,p[cur].rs);
pushup(cur);
}
void add(long long l,long long r,long long L,long long R,long long c,long long cur)
{
if(l>=L&&r<=R)
{
p[cur].lazy+=c;
p[cur].sum+=c*(r-l+1);
return;
}
pushdown(cur,l,r);//
long long mid=(l+r)/2;
if(mid<R)add(mid+1,r,L,R,c,p[cur].rs);
if(mid>=L)add(l,mid,L,R,c,p[cur].ls);
pushup(cur);//
}
long long query(long long l,long long r,long long L,long long R,long long cur)
{
long long tot=0;
if(l>=L&&r<=R)
return p[cur].sum;
long long mid=(l+r)/2;
pushdown(cur,l,r);
if(mid<R)tot+=query(mid+1,r,L,R,p[cur].rs);
if(mid>=L)tot+=query(l,mid,L,R,p[cur].ls);
return tot;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++)
scanf("%lld",&a[i]);
long long rt=++ct;
build(1,n,rt);
long long d,x,y,k;
for(long long i=1;i<=m;i++)
{
scanf("%d",&d);
if(d==1)
{
scanf("%lld%lld%lld",&x,&y,&k);
add(1,n,x,y,k,rt);
}
if(d==2)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(1,n,x,y,rt));
}
}
return 0;
}
洛谷P3372线段树模板1——线段树的更多相关文章
- 【原创】洛谷 LUOGU P3373 【模板】线段树2
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第 ...
- 洛谷 P3373:【模板】线段树 2(区间更新)
题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别 ...
- [洛谷P3701]「伪模板」主席树
题目大意:太暴力了,就不写了,看这儿 题解:对于每个$byx$的人,从源点向人连边,容量为此人的寿命. 对于每个手气君的人,从人向汇点连边,容量为此人的寿命. 对于每个$byx$的人与手气君的人,如果 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 【洛谷P3369】【模板】普通平衡树题解
[洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...
- 洛谷P3372 【模板】线段树 1
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...
- 洛谷 P3372 【模板】线段树 1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- 洛谷—— P3372 【模板】线段树 1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- 线段树入门详解,洛谷P3372 【模板】线段树 1
关于线段树: 本随笔参考例题 P3372 [模板]线段树 1 所谓线段树就是把一串数组拆分成一个一个线段形成的一棵树. 比如说像这样的一个数组1,2,3,4,5: 1 ~ 5 / ...
随机推荐
- vue-strap 修改Modal组件
在用到vue-strap的Modal组件时,会有两个默认按钮,查看官方文档配置如下: 可以看到,ok-text和cancel-text都有一个默认值,在使用时即使不给这两个选项赋值,也会显示两个默认文 ...
- mybatis--foreach,choose 小结
写博客个人不喜欢写那种长篇大论.富有文採与哲学的文章,搞开发的就喜欢直击重点,仅仅记录重要的信息就好了,以后查看的时候也很方便! mybatis 中 在if语句或when中 假设推断一个字段是否和1同 ...
- java 多参实现
package com.northeasttycoon.monitor.service; import static java.lang.System.out; /** * Created by no ...
- 【BZOJ2151】种树 双向链表+堆(模拟费用流)
[BZOJ2151]种树 Description A城市有一个巨大的圆形广场,为了绿化环境和净化空气,市政府决定沿圆形广场外圈种一圈树.园林部门得到指令后,初步规划出n个种树的位置,顺时针编号1到n. ...
- 九度OJ 1034:寻找大富翁 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5925 解决:2375 题目描述: 浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入: 输入包含多组测试用例. ...
- 2017-2018-1 20179209《Linux内核原理与分析》第五周作业
一.实验:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 环境说明 实验环境为 Ubuntu16.10 和 实验楼环境. 选择39号系统调用实验.39号系统调用为mkdir系统调用. ...
- 我的Java开发学习之旅------>Java经典排序算法之冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...
- ABAP screen
Instance One : SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-100. SELECTION-SCREEN BEGIN ...
- ME01 创建货源清单
[转自 http://blog.sina.com.cn/s/blog_6466e5f70100ix3p.html ] SAP中采购货源清单创建的方法有以下几种: 1.ME01 手动逐个创建. 2.ME ...
- re.sub用法
re.sub功能是对于一个输入的字符串,利用正则表达式,来实现字符串替换处理的功能返回处理后的字符串 re.sub共有五个参数 三个必选参数pattern,repl,string 两个可选参数coun ...