随笔分类 - 数据结构
栈,队列,线段树,树状数组,可持久化数据结构,平衡树,动态树,并查集,左偏树,K-D Tree,点分治,哈夫曼树
摘要:并查集按秩合并的裸题。。。 cpp include include include using namespace std; const int N=500005; int fa[N],lastans,val[N],n,Q,u,v,opt,cnt,dep[N]; bool tong[N]; int
阅读全文
摘要:真·清新 如果根是1的话,先预处理出来没有变化的时候的answer,然后修改的时候就相当于1-x的路径上的节点上的贡献就由∑(sumx)^2 变成∑(sumx+detla)^2 这样的话就加了x^2*(路径上点的个数)+2*x*(路径上点权和) 换根的推导式子如下,摘自洛谷题解区。。。 #inclu
阅读全文
摘要:Informatik verbindet dich und mich Informatik verbindet dich und mich 扩展欧拉定理+线段树。 Informatik verbindet dich und mich 由扩展欧拉定理得,cc...最终上面的指数必定变成1.(不会打这个
阅读全文
摘要:惊奇地发现,如果一个区间能被判定是错的,当且仅当这个区间被已知权值的区间夹着,且表出的区间值与给出的不相等,才能表示这个区间GG了。 然后用带权并查集维护当前节点所能表示的最远区间及其权值。如果发现新的区间的find(l-1)==find(r),就可以猜猜看它的正确性了。 #include <ios
阅读全文
摘要:题面: 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P≤100000)个指令.指令有两种: 1.移动(M):将包含X的立方柱移动到包含Y的立方柱上. 2.统计(C):统计名含X的立方柱中,在X下方的方块
阅读全文
摘要:寒假zrt讲过,用并查集维护这个点往后最近的白色馒头是谁,然后时光倒流,直接往它的fa处跳就行了。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=1000005; i
阅读全文
摘要:把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const i
阅读全文
摘要:ETT的模板题。 我们把欧拉序标出来, 把入栈视作+,出栈视作-。 它的子树一定是在两个欧拉序中间的。 然后把欧拉序当做一个区间维护,换父亲就把左右两端这个区间挪到它的新父亲的入栈的右边。用splay维护一下就行了。 但是!这个@#$%^&题卡数组版splay????? 但是不卡spaly???(单
阅读全文
摘要:LCT板子题。 和线段树2的操作方法一样,先乘后加就行了。洛谷评分虚高 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=100005,mod=51061; int n,
阅读全文
摘要:一下午搭进去了。。 最后发现少写了个pushup??? 有个关键的细节就是每次可合并两个区间的时候要判断一下ls的最左边的颜色和rs最右边的颜色一样不一样,一样就ans-- 然后就update和query的时候把链分成两节弄,否则很麻烦。 #include <iostream> #include <
阅读全文
摘要:lct模板题。把所有的边按照a排个序,然后挨个加进去,然后以b为边权,求一个动态最小生成树。把每条边想成一个点,嵌在两个端点之间,然后每次加边的时候判一下新边的两个端点连不连通,连通的话就找两点路径上的权值最大的那个"边点"上的点权,把它和两端点cut了,然后再link这个"边点"和两个点。 #in
阅读全文
摘要:lct模板题。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=10005; int fa[N],ch[N][2]; bool rev[N]; bool ck(int
阅读全文
摘要:k叉哈夫曼树。 需要保证权值尽量小的前提下深度最小。 我们可以把k个节点合并成一个节点,最后合成一个。 所以如果n-1不是k-1的倍数,就补起来。最后就是先取k个最小的,用一个假的节点连起来,然后把这k个东西当成一个新的节点,节点的权值是k个点的权值和。 #include <iostream> #i
阅读全文
摘要:陈年老题。。。 我就$%^&。。。 码了4k多。。。 主要就是用splay,然后处理区间上的东西 区间反转就和模板一样,但是要记得反转leftmax和rightmax 区间赋值就把那个区间提取出来,然后给子树根打个same标记,表示下面的全一样。 区间求最大子段和就和线段树的套路一样。 区间插入就先
阅读全文
摘要:splay区间反转练手题 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N=100005; int n,fa[N],ch[N][2],val[N],siz[N],to
阅读全文
摘要:平衡树模板题,set也能做。求个前驱后继,按照题目上说的做就行了。 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <ctime> using namespace std; co
阅读全文
摘要:树剖板子题。 但是我太弱了。 没有看见值域是[-30000,30000],然后把mx的最小值设的-1。。。问问问 改了就A了。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const in
阅读全文
摘要:大意:求一个序列有几个子序列的和小于给定值,里面的数有正有负,序列长度≤200000。 列个式子,其实求的是sum[r]-sum[l-1]<T sum[r]-T<sum[l-1] 所以我们可以枚举r,然后用树状数组找小于sum[r]-T的数的个数。记得要在树状数组里先加一个0,表示L取1,即从头开始
阅读全文
摘要:左偏樹的題。 把每個節點上有的騎士按照攻擊力的大小建一個小根堆。dfs的時候把兒子們的都合並過來,看看update完了的值是否小於防禦值。小於的話就pop,然後ans[x]++。記得開long long cpp include include include using namespace std;
阅读全文