动态开结点线段树板子。

#include<cstdio>
using namespace std;
typedef long long ll;
ll sumv[400005],delta[400005];
int lc[400005],rc[400005],tot,root;
void newnode(int &rt){
rt=++tot;
lc[rt]=rc[rt]=0;
sumv[rt]=delta[rt]=0;
}
void buildtree(int &rt,int l,int r){
if(!rt){
newnode(rt);
}
if(l==r){
scanf("%I64d",&sumv[rt]);
return;
}
int m=(l+r>>1);
buildtree(lc[rt],l,m);
buildtree(rc[rt],m+1,r);
sumv[rt]=sumv[lc[rt]]+sumv[rc[rt]];
}
void pushdown(int rt,int size)
{
if(!lc[rt]){
newnode(lc[rt]);
}
if(!rc[rt]){
newnode(rc[rt]);
}
if(delta[rt]){
delta[lc[rt]]+=delta[rt];
delta[rc[rt]]+=delta[rt];
sumv[lc[rt]]+=delta[rt]*(ll)(size-(size>>1));
sumv[rc[rt]]+=delta[rt]*(ll)(size>>1);
delta[rt]=0;
}
}
void update(int ql,int qr,ll v,int &rt,int l,int r){
if(!rt){
newnode(rt);
}
if(ql<=l && r<=qr){
delta[rt]+=v;
sumv[rt]+=v*(ll)(r-l+1);
return;
}
pushdown(rt,r-l+1);
int m=(l+r>>1);
if(ql<=m){
update(ql,qr,v,lc[rt],l,m);
}
if(m<qr){
update(ql,qr,v,rc[rt],m+1,r);
}
sumv[rt]=sumv[lc[rt]]+sumv[rc[rt]];
}
ll query(int ql,int qr,int rt,int l,int r){
if(!rt){
return 0;
}
if(ql<=l && r<=qr){
return sumv[rt];
}
pushdown(rt,r-l+1);
int m=(l+r>>1);
ll res=0;
if(ql<=m){
res+=query(ql,qr,lc[rt],l,m);
}
if(m<qr){
res+=query(ql,qr,rc[rt],m+1,r);
}
return res;
}
int n,m;
int main(){
int op,x,y;
ll z;
// freopen("luogu3372.in","r",stdin);
scanf("%d%d",&n,&m);
buildtree(root,1,n);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&op,&x,&y);
if(op==1){
scanf("%lld",&z);
update(x,y,z,root,1,n);
}
else{
printf("%lld\n",query(x,y,root,1,n));
}
}
return 0;
}

【线段树】洛谷 P3372 【模板】线段树 1的更多相关文章

  1. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  2. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  3. 【BZOJ2830/洛谷3830】随机树(动态规划)

    [BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...

  4. 洛谷P3372 【模板】线段树 1

    P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...

  5. 线段树入门详解,洛谷P3372 【模板】线段树 1

    关于线段树: 本随笔参考例题      P3372 [模板]线段树 1 所谓线段树就是把一串数组拆分成一个一个线段形成的一棵树. 比如说像这样的一个数组1,2,3,4,5: 1 ~ 5 /       ...

  6. 洛谷P3372线段树1

    难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...

  7. 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]

    题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...

  8. 洛谷P4114 Qtree1(树链剖分+线段树)

    传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 //minamoto #include& ...

  9. 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)

    题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...

  10. 洛谷P3374(线段树)(询问区间和,支持单点修改)

    洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...

随机推荐

  1. 4.0docker部署

    设置容器的端口映射 -P  :容器暴露的所有端口映射 -p :指定映射容器暴露的端口 Nginx部暑流程 docker run -p 80 --name web -t -i ubuntu /bin/b ...

  2. Java——关于static关键字的那些事总结

    前言: 先说说今天为啥要谈这个东西,虽然学Java已经有两年了,但是今天,本着温故而知新的态度,仔细的第三次翻看了<Head Firt Java>这本书,虽然这本书介绍的很多东西都特别基础 ...

  3. FindQQByProcess

    看网上有许多通过进程寻找QQ号的例子,看了一下,里面涉及的知识点还是比较多,但网上的兼容性不太好,而且没有给出匹配字符的来源,所以自己动手写了一下,顺便给出一些我调试的结果. #include &qu ...

  4. 网络设备之分配net_device结构

    注册网络设备时,会调用pci_driver->probe函数,以e100为例,最终会调用alloc_netdev_mqs来分配内存,并且在分配内存后调用setup函数(以太网为ether_set ...

  5. 如何掌握jQuery插件开发(高能)

    在实际开发工作中,总会碰到像滚动,分页,日历等展示效果的业务需求,对于接触过jQuery以及熟悉jQuery使用的人来说,首先想到的肯定是寻找现有的jQuery插件来满足相应的展示需求.目前页面中常用 ...

  6. python manage.py 命令

    在用命令django‐admin.py startproject <工程目录>建立一个django工程文件时,会生成一个manage.py文件,那么这个manage.py到底可以干嘛呢? ...

  7. Oracle简述

    Oracle是甲骨文公司推出的一款大型数据库管理系统.甲骨文公司成立于1977年,总部位于美国加利福尼亚州的红木滩.1989年,Oracle正式进入中国市场:2013年,甲骨文超越 IBM ,成为继 ...

  8. DBUtile

    DBUtils是Python的一个用于实现数据库连接池的模块. 模式: - 每个线程创建一个连接,关闭(默认不关闭),线程终止时,才关闭连接. - 创建共享连接池 应用:只要写原生SQL,用户数据框连 ...

  9. (ubuntu) pip install scandir 时出现错误 fatal error: Python.h: No such file or directory

    安装 jupyter时遇到这个问题,在这里查到了解决方法,特记录一下. 解决方式为: 先安装 python-dev: $ sudo apt-get install python-dev 然后再安装需要 ...

  10. 通过IP地址和子网掩码计算主机数

    知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 子网掩码是255·255·255·0.算出 ...