【线段树】洛谷 P3372 【模板】线段树 1
动态开结点线段树板子。
#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的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 【BZOJ2830/洛谷3830】随机树(动态规划)
[BZOJ2830/洛谷3830]随机树(动态规划) 题面 洛谷 题解 先考虑第一问. 第一问的答案显然就是所有情况下所有点的深度的平均数. 考虑新加入的两个点,一定会删去某个叶子,然后新加入两个深度 ...
- 洛谷P3372 【模板】线段树 1
P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交 讨论 题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷 ...
- 线段树入门详解,洛谷P3372 【模板】线段树 1
关于线段树: 本随笔参考例题 P3372 [模板]线段树 1 所谓线段树就是把一串数组拆分成一个一个线段形成的一棵树. 比如说像这样的一个数组1,2,3,4,5: 1 ~ 5 / ...
- 洛谷P3372线段树1
难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...
- 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...
- 洛谷P4114 Qtree1(树链剖分+线段树)
传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 //minamoto #include& ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
- 洛谷P3374(线段树)(询问区间和,支持单点修改)
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
随机推荐
- TOYS(计算几何基础+点与直线的位置关系)
题目链接:http://poj.org/problem?id=2318 题面: TOYS Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
- 关于js闭包官方解释庖丁解牛式理解
闭包:是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 变量+环境 首先按这个句子主谓宾来分解.闭包是一个表达式,通常是一个函数. 这意味着第一它 ...
- echart自定义tooltip
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Perl中文件读取操作
Perl中文件读取操作 http://blog.csdn.net/yangxuan12580/article/details/51506216
- JavaScript里的小妖精
JavaScript里的小妖精———this!! 关于this指向这个问题,活生生折磨了我一个下午,回来静下心捋顺一下,总结出来一下规律. 当然,this这个复杂的问题不是一句两句可以说清楚,作为菜鸟 ...
- WordPress个人博客搭建
搭建LNMP环境 请参考前面的博文自行搭建 部署WordPress #创建数据库和用户 mysql -uroot -p123456 -S /data/3306/mysql.sock create da ...
- Linux Python apache的cgi配置
一.找到安装Apache的目录/usr/local/apache2/conf,并对httpd.conf配置文件进行修改 1.加载cgi模块 去掉注释: LoadModule cgid_module m ...
- Django-分頁組件
一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib imp ...
- poj2104 主席树 区间K大 在线 无修改
关于主席树: 主席树(Chairman Tree)是一种离线数据结构,使用函数式线段树维护每一时刻离散之后的数字出现的次数,由于各历史版本的线段树结构一致,可以相减得出区间信息,即该区间内出现的数字和 ...
- 在C#中使用正则表达式筛选出图片URL并下载图片URL中的图片到本地
本功能主要用到的知识点如下: 1.正则表达式 2.C#中下载文件功能的实现 3.泛型集合的使用 4.进程的简单操作(用于结束当前程序) 下面就简单说一下是如何使用这些知识点的.先详细说下这个程序主要实 ...