树上操作
卡常带师
这个作者很懒,什么都没留下…
展开
-
环套树
P1453 先把环处理出来,然后对环上每个节点树形DP,然后环形DP就好 //#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define sz(a) (int)a.size() #define INF 0x3f3f3f3f #define DNF 0x7f #define DBG printf(".原创 2020-09-24 11:06:11 · 182 阅读 · 0 评论 -
牛客多校第七场 A National Pandemic
算是一个小技巧吧,所有题目在给定或者求出计算公式之后,都可以去朝着把恒定的值或者成对出现的值单独拿出来维护 比如这个题 w - dis(x,y) = w - dep[x] - dep[y] + w * dep[LCA(x, y)] ,我们就会发现 w - dep[x] 为定值 , dep[y]可以通过维护次数 那么重点在于dep[LCA(x,y)],这个地方是一个小技巧,我们可以通过修改根到x的路径上的每一条边,使得每条边权值+1,然后在 维护答案的时候,query一下根到x的路径上的和就好了。具体.原创 2020-09-03 22:00:35 · 145 阅读 · 0 评论 -
牛客多校第四场 Ancient Distance
//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define sz(a) (int)a.size() #define INF 0x3f3f3f3f #define DNF 0x7f #define DBG printf("this is a input\n") #define fi first #.原创 2020-09-02 12:05:52 · 123 阅读 · 0 评论 -
牛客暑期多校训练营第一场 Infinite Tree
//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define sz(a) (int)a.size() #define INF 0x3f3f3f3f #define DNF 0x7f #define DBG printf("this is a input\n") #define fi first #.原创 2020-08-31 22:40:10 · 112 阅读 · 0 评论 -
P3233 世界树 虚树+树形DP
//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define sz(a) (int)a.size() #define INF 0x3f3f3f3f #define DNF 0x7f7f7f7f #define DBG printf("this is a input\n") #define fi f.原创 2020-08-19 21:43:57 · 139 阅读 · 0 评论 -
牛客练习赛67 牛妹的苹果树
题意:输出给定的点序号区间中两点间距离的最大值 思路: 考虑倍增思想,st[u][i] 代表从u号节点开始往后2^i个连续数中的直径的两个端点。 st[u][i] 一定是由 st[u][i-1] 和 st[u + 2^(i-1)][i-1]转移过来的 思考怎么转移,显然对应6种情况 1.若两个块中的直径的端点俩俩之间不存在LCA,那么显然直径存在与两个块中的其中一个(2种) 2.若两个块中的直径的端点俩俩之间存在LCA,那么显然对应四种情况,只需要选出其中最大的点对即可 //#define原创 2020-08-15 18:00:56 · 127 阅读 · 0 评论 -
P5043 树哈希模版(以后还得找其他的模版更新
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define p_queue priority_queue #define DBG printf("this is a input\n") #define fi first #define se second #define mk(a.原创 2020-05-21 22:58:33 · 134 阅读 · 0 评论 -
DFS序+BIT离线统计子树中小于该节点的数量+三元计数
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define p_queue priority_queue #define DBG printf("this is a input\n") #define fi first #define se second #define mk(a.原创 2020-05-19 13:31:18 · 157 阅读 · 0 评论 -
点分治 模板
//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DNF 0x7f #define DBG printf("this is a...原创 2020-04-30 09:33:58 · 116 阅读 · 0 评论 -
虚树+树形dp P2495
1.虚树的建立需要考虑dp方程,然后决定建树细节,不然会出错 //#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DNF 0x...原创 2020-04-29 11:57:18 · 179 阅读 · 0 评论 -
基环森林
//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #defin...原创 2020-04-24 11:20:40 · 246 阅读 · 0 评论 -
求树上点集(带修改)的最小覆盖线段集合的值
结论,点集按dfs序从小到大首尾相连,则答案为距离和的二分之一 #define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG pri...原创 2020-04-23 09:20:05 · 213 阅读 · 0 评论 -
AcWing353 经典的树上差分+动态开点+权值线段树合并
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-04-20 10:38:41 · 242 阅读 · 1 评论 -
树上启发式合并CF600E
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-04-19 13:03:42 · 194 阅读 · 0 评论 -
队列数组模拟+树的直径+二分+贪心 AcWing351
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-04-18 17:46:09 · 99 阅读 · 0 评论 -
重链剖分求LCA
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-04-13 15:08:55 · 131 阅读 · 0 评论 -
重链剖分-维护点权模版
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-04-13 14:22:18 · 90 阅读 · 0 评论 -
树上差分之点差 P3128
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-03-27 11:43:43 · 96 阅读 · 0 评论 -
kruskal建立最大树+树上倍增+LCA(存个板子)
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-03-26 20:52:01 · 159 阅读 · 0 评论 -
树的直径
1.DP求树的直径 void dfs(int u) { // dp[i]表示以i为根的最长树链 vis[u] = 1; for(int i = head[u] ; i != -1 ; i = edge[i].next) { int v = edge[i].t; if(!vis[v]) { d...原创 2020-03-02 21:07:55 · 287 阅读 · 0 评论 -
树的重心 poj1655
#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <queue> #include <set> #include <map> using namespace std; #define ...原创 2020-03-02 20:52:51 · 111 阅读 · 0 评论 -
tarjan?+并查集 求LCA T了3个点(懒得改) P3379
#include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DBG printf("this is a input\n") #define fi first #defi...原创 2020-03-01 15:34:51 · 146 阅读 · 0 评论