学习知识来自AGOH的B站视频

银酱对线段树合并空间大小的计算

模板题

#include <bits/stdc++.h>using namespace std;
typedef long long ll;
const int maxn = 2e5 + 10;
struct node {//权值线段树 动态开点int l, r;ll val;
}sgt[(maxn+10) * 40];
int cnt, root[maxn+10];
int n, m;
void pushup(int rt) {sgt[rt].val = sgt[sgt[rt].l].val + sgt[sgt[rt].r].val;
}
void modify(int &rt, int l, int r, int pos, int x) {if(!rt) rt = ++ cnt;sgt[rt].val += x;if(l == r) return;int mid = (l + r) >> 1;if(pos <= mid) modify(sgt[rt].l,l,mid,pos,x);if(pos > mid) modify(sgt[rt].r,mid+1,r,pos,x);
}int split(int &rt, int l, int r, int posl, int posr) {//把区间posl到posr分裂出来int now = ++ cnt;if(posl <= l && posr >= r) {sgt[now] = sgt[rt];//直接继承rt = 0;//分裂出来的旧子树下面就直接NULL} else {int mid = (l + r) >> 1;if(posl <= mid) sgt[now].l = split(sgt[rt].l,l,mid,posl,posr);if(posr > mid) sgt[now].r = split(sgt[rt].r,mid+1,r,posl,posr);pushup(now);pushup(rt);}return now;
}ll ask(int rt, int l, int r, int posl, int posr) {if(posl <= l && posr >= r) return sgt[rt].val;ll sum = 0;int mid = (l + r) >> 1; if(posl <= mid) sum += ask(sgt[rt].l,l,mid,posl,posr);if(posr > mid) sum += ask(sgt[rt].r,mid+1,r,posl,posr);return sum;
}ll ask(int rt, int l, int r, int kth) {if(l == r) return l;int mid = (l + r) >> 1;if(kth <= sgt[sgt[rt].l].val) return ask(sgt[rt].l,l,mid,kth);else return ask(sgt[rt].r,mid+1,r,kth-sgt[sgt[rt].l].val);
}void merge(int &x, int y) {if(!x || !y) x |= y;//将y合并到x里面else {sgt[x].val += sgt[y].val;merge(sgt[x].l,sgt[y].l);merge(sgt[x].r,sgt[y].r);}
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; ++ i) {int x;cin >> x;modify(root[1],1,n,i,x);}int last = 1;while(m --) {int op, x, y, z;cin >> op;if(op == 0) {cin >> x >> y >> z;root[++last] = split(root[x],1,n,y,z);} else if(op == 1) {cin >> x >> y;merge(root[x],root[y]);} else if(op == 2){cin >> x >> y >> z;modify(root[x],1,n,z,y);} else if(op == 3) { cin >> x >> y >> z;cout << ask(root[x],1,n,y,z) << "\n"; } else {cin >> x >> y;if(y > sgt[root[x]].val) cout << "-1\n";else  cout << ask(root[x],1,n,y) << "\n";}}return 0;
}

线段树分裂与合并的模板以及空间大小的计算相关推荐

  1. 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]

    题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...

  2. 线段树分裂与合并 ---- 树上差分 P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并

    题目链接 解题思路: 首先题目是对u,vu,vu,v这两条路径上面添加一个zzz,然后运用树上点的差分思想,对于分发路径u,vu,vu,v,我们在uuu上+1+1+1,在vvv上+1+1+1,在lca ...

  3. 线段树练习——区间合并

    这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解) hdu 3308 http://acm.hdu.edu.cn/showproblem.p ...

  4. 模版:线段树合并+线段树分裂

    文章目录 前言 合并 代码 分裂 代码 前言 话说天下之树,分久必合,合久必分 合并 所谓合并,就是把两个树合并 以把B树合并到A树为例 如果A没有该节点,改成B的该节点返回 如果B没有该节点,直接返 ...

  5. [HDOJ3308]LCIS(线段树,区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308 题意:给定n个数,两个操作: U A B:将位置A的数值改成B Q A B:查询[A,B]内最长 ...

  6. 线段树(单点更新(模板)) 之 hdu 1166

    // [7/24/2014 Sjm] /* 第一道用线段树做的题,照着大神的代码风格写的,,就当作线段树单点更新的模板吧....(当年用树状数组做的:代码见这里) */ 1 #include < ...

  7. P3373 【模板】线段树1和P3373 【模板】线段树 2

    P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上 kk. 求出某区间每一个数的和. 输入格式 第一行包含两个整数 n, mn,m,分别表示该 ...

  8. 线段树(区间修改)模板题 Luogu 2357 守墓人

    众所周知,线段树可以在O( log n)的时间内进行很多修改和查询的操作,应用很广. 线段树,顾名思义,是一个二叉树,但是每个节点,存的不是不是"数",而是一个"区间&q ...

  9. hdu 5052 树链剖分+线段树+区间合并

    各种裸,但合在一起好恶心... 因为路径是有向的,所以要维护区间里向两个方向走的最大收益和区间里的最大最小值,要用到区间合并的线段树 #include <iostream> #includ ...

最新文章

  1. D2前端技术论坛之网页无障碍学习笔记
  2. 期末不挂科のJAVA
  3. python人脸识别门禁_用Python做人脸识别
  4. VS2010,C++ 制作静态库(*.lib),并使用
  5. SAP License:SAP Query操作手册
  6. 小白都能看懂的numpy与pandas中axis解释
  7. bsvadvaanjalvsc
  8. 紫色范冰冰WIN7主题包
  9. DDoS异常流量清洗解决方案
  10. 《西部世界》在线观看与观后感
  11. GIC检测中断的流程
  12. Nginx proxy_pass指令(代理配置)
  13. Blender插件Gizmo 3d Cursor And Saving Position 3D 1.5.0 光标
  14. 【Android 教程系列第 27 篇】如何使用 Keytool 工具生成 keystore 签名文件
  15. 教你用Python如何玩转声音文件,将声音按照语音间隙切割为片段
  16. 韩顺平Java基础-第一阶段(建立编程思想)
  17. Java面向对象总结
  18. 电脑上安装windows phone 8模拟器(wp8) 和wp8手机解锁 详细教程 wp7也适用
  19. 简述TCP的三次握手
  20. Java单例模式(饿汉式和懒汉式)代码

热门文章

  1. JSP第二次作业_7小题
  2. RGBD相机模型与图片处理
  3. 官方 | TensorFlow 2.0分布式训练教程
  4. 干货 | tensorflow模型导出与OpenCV DNN中使用
  5. 基于点云的3D障碍物检测
  6. U平方Net:深入使用嵌套的U型结构进行显著目标检测
  7. 【译】 WebSocket 协议第十一章——IANA 注意事项(IANA Considerations)
  8. V神再为BCH发声!
  9. IBM首家发布了公有云中的裸机Kubernetes
  10. DotNetCore跨平台~dotnet pack打包详细介绍