首页 > TAG信息列表 > PushUp

堆板子计划

LCT*1 struct LCT_Tree{ #define lch V[p].son[0] #define rch V[p].son[1] #define Isroot(p) (V[V[p].fa].son[0]!=p && V[V[p].fa].son[1]!=p) #define Son(p) (V[V[p].fa].son[1]==p) struct Vertex{int son[2],siz,sum,t1,fa;}V[maxn]; int tot; int New(

平衡树

fhq treap(无旋treap) treap:其中每个点有输入值与随机值两种值,输入值满足二叉树性质,随机值满足堆性质。 而fhq如何实现平衡呢 它需要两个操作:分裂与合并 分裂: 目的:将其分成所有权值都大于或小于等于某一值的两棵平衡树 我们现在需要两个指针,每一次走到该点权值是否大于该值的反方向

【线段树】模板题pushup+pushdown操作

博客主页: https://blog.csdn.net/qq_50285142欢迎点赞

CF1137F-Matches Are Not a Child‘s Play【LCT】

正题 题目链接:https://www.luogu.com.cn/problem/CF1137F 题目大意 给出\(n\)个点的一棵树,第\(i\)个点权值为\(i\)。 一棵树的删除序列定义为每次删除编号最小的叶子并将其加入序列末尾。 要求支持 修改一个点的权值为一个比目前所有权值都要大的一个值 询问一个点在删除序列的

普通平衡树

#include<bits/stdc++.h> #define val(rt) t[rt].val #define dat(rt) t[rt].dat #define cnt(rt) t[rt].cnt #define size(rt) t[rt].size #define l(rt) t[rt].l #define r(rt) t[rt].r using namespace std; const int N = 1e5+5; const int INF = 1e9; struct Tre

kuangbin线段树专题(更新中)

写在前面的话 博主也是个新手, 最近正在写kuangbin的线段树专题, 感觉整体线段树专题的难度也是从易到难的. 但是的确在做题过程中遇到了 许多困难, 也学到了很多东西, 希望这些能帮到后来者. 当然如果您有不同的见解, 或者发现了代码中的错误, 也希望您能提出我们一同探讨.

[COI2009] OTOCI - LCT

Description 维护一个森林,支持连边、修改点权、询问路径点权和 Solution 基础的 LCT 点权信息维护 #include <bits/stdc++.h> using namespace std; const int N = 100000; int n,m,val[N]; namespace lct { int top, q[N], ch[N][2], fa[N], sum[N], rev[N]; inline void pu

线段树

本人深受动态开点的影响(动态开点好处多 决定将线段树写法全部变成动态开点,例如build函数 void build(int &u,int l,int r) { if(!u) u=++num; tree[u].l=l; tree[u].r=r; if(l==r) { tree[u].val=v[l]; return ; } int mid=(l+r)>>1; build(tree[u].lson,

Luogu4219 [BJOI2014]大融合

Link Solution 求两端点的子树大小然后相乘。 可以想到直接断边然后两边都\(makeroot\)一下。答案就是根节点的\(size\)。 但是怎么维护\(size\)呢?实子树大小可以直接由两个实儿子得到。但是虚子树不行。所以可以对每个点多维护一个\(sv[]\),表示这个节点的虚子树大小总和。 那么\(

平衡树

平衡树 Treap实现 思路: 利用堆的性质, 让二叉搜索数满足堆的性质,从而达到logn的高度. 模板 具体解释看注释,注释也不多(逃) 代码: /* * 平衡数Treap模板 * Treap 可以理解为一棵树加上一个堆, 通过对每个节点赋予一个随机值 * 在满足堆的性质的同时满足二叉搜索树的性质, 保

BZOJ 4849 [NEERC2016] Mole Tunnels (模拟费用流)

题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4849 题解 其实也是模拟费用流,但是这道题和一般的题目不一样,这道题是在一个完全二叉树上 这意味着我们根本不需要考虑什么类似数轴上老鼠进洞之类的做法,我们跑费用流,每次选一条最短路增广即可 然后增广之后最短路上的

楼房重建

不错的一道题。 题意:每次修改一栋楼,求这些楼顶跟原点$(0,0)$的斜率单调上升长度(不是$\text{LIS}$)。 因为一个楼房能被看到可以等价于它的斜率比之前的任何一个都大。 这道题实际上满足区间合并,但是比较麻烦。 重点就在$\text{pushup}$的写法。 首先定义线段树中区间的解即为该对应

通用动态树(Link-Cut Tree)模板

一个没有维护任何东西的动态树模板 忘了怎么写可以直接来粘 int ch[300010][2], fa[300010], st[300010]; bool lazy[300010]; bool nroot(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; } void rev(int x) { swap(ch[x][0], ch[x][1]), lazy[x] ^= 1; } void pushup(