07 2018 档案

摘要:复杂度nlog2n 边权可以转化成点权 搞一个根 把边权给到边两端深度大的哪个点 这样处理要删一个点 要删的是lca(x,y) 第一步 处理出fa deep size son 第二步 连接重链 处理出top dfn rk 注意先处理重链再处理轻链 保证了重链的dfn值连续 求lca步骤: 如果两个是 阅读全文
posted @ 2018-07-29 20:27 Aragaki 阅读(173) 评论(0) 推荐(0)
摘要:G.coloring tree BFS计数 题目:给你n(<=5000)个节点的一颗树 你有K(<=5000)种颜色 你可以给每一个节点染一种颜色 总共有Kn种染色方法 在一种染色方法中 定义colorness为每一对相同颜色节点距离中的最短距离 问colorness为D时 有多少种染色方案 结果% 阅读全文
posted @ 2018-07-27 20:04 Aragaki 阅读(284) 评论(0) 推荐(0)
摘要:对于每个连通块欧拉回路存在的条件 无向图:只存在两个或者零个度数为奇数的点 有向图:每个点的入度等于出度或者至多有两个点入度不等于出度且一个出度比入度多一另一个入度比出度多一 HDU 多校第二场 C.cover 题意:给你一个无向图 问你一笔画最多多少次能把所有边覆盖(走过的边不能走) 并且输出每个 阅读全文
posted @ 2018-07-27 17:01 Aragaki 阅读(421) 评论(0) 推荐(1)
摘要:虚树做法 虚树是把原树中少量的有效节点和他们两两的LCA拿出来,去除一些无效节点,从而降低复杂度。 如果有效节点是K个的话 加上LCA 虚树中的的点最多为min(n,2*K)个 建虚树的复杂度为O(k*logn) 虚树上树形dp的复杂度为O(k) 证明: 按dfn值从小到大加入有效节点 假设现在加入 阅读全文
posted @ 2018-07-24 21:42 Aragaki 阅读(462) 评论(2) 推荐(0)
摘要:原图-->dfs图-->支配树 支配点:支配树中Y的祖先加上它自己 都是Y的支配点.去掉支配点使得在原图中源点无法到达Y(即必经点) 最近支配点:支配树中Y最近的祖先 半支配点:在dfs tree中可以通过非dfs tree中的边到达y的深度最小的节点x 为y的半支配点 Lengauer-Tarja 阅读全文
posted @ 2018-07-23 22:00 Aragaki 阅读(333) 评论(0) 推荐(0)
摘要:A dp[i][j][k]可以n3地做 但是正解是找把问题转化为一个两点不相交路径 最终答案为C(n+m, n)2-C(n+m, m-1)C(n+m,n-1) B 把题目的矩阵看成无向图的邻接矩阵 这题可以转化为给你n个点 每个点的度数必须为2 有几种情况 Orz... C D 弄懂同构的意思然后直 阅读全文
posted @ 2018-07-20 12:59 Aragaki 阅读(130) 评论(0) 推荐(0)
摘要:A 一个很好想的dp ll dp[maxn][2]; int main() { scanf("%d%d",&n,&k); memset(dp,0,sizeof(dp)); dp[1][0]=1,dp[k][0]=1; for(int i=1;i<=n;i++) { dp[i+1][1]+=dp[i] 阅读全文
posted @ 2018-07-19 20:32 Aragaki 阅读(159) 评论(0) 推荐(0)
摘要:线段树建边 A 如果把边数缩小到n^2可以接受的话 就是一个最小点基的裸题 但是这里可能有n^2条边所以我们需要线段树优化建边 然后再求出SCC 扣掉不包含原始n个节点的SCC或者把除叶子节点外线段树上的点权设为inf 然后跑最小点基 claris姐姐版SCC缩点: #include<cstdio> 阅读全文
posted @ 2018-07-18 21:55 Aragaki 阅读(199) 评论(0) 推荐(0)
摘要:A 增广 #include<bits/stdc++.h> using namespace std; const int MAXN = 1000000 + 10; vector<int> g[MAXN]; int a[MAXN], b[MAXN], sz[MAXN], cnt[MAXN]; bool 阅读全文
posted @ 2018-07-17 21:20 Aragaki 阅读(218) 评论(0) 推荐(0)
摘要:Dij SPFA dfs求负环版 #include<bits/stdc++.h> using namespace std; const int maxn = 2e5+ 5; struct lpl{ int to, dis; }lin; vector<lpl> point[maxn]; int n, 阅读全文
posted @ 2018-07-16 21:10 Aragaki 阅读(163) 评论(0) 推荐(0)
摘要:给你N个点和M条边 要求你求出一个生成树使得这个生成树里边权极差最小 做法① n*m做法 当最小的边已知的时候这个生成树就确定 所以最大的边也确定了 于是我们每次枚举最小的边 然后用kruskal做一遍得到答案 m*logn LCT 阅读全文
posted @ 2018-07-14 19:56 Aragaki 阅读(354) 评论(0) 推荐(0)
摘要:算法: 求出MST之后枚举每条在MST之外的边 连上之后会出现环 找到环中除加上的边之外权值最大的边 删除该边之后得到一颗新树 做法: 利用LCA倍增地维护最小生成树上两点之间的最大边权 每次枚举在MST之外的边 有两种情况 ①.两个端点在一条链上 ②.两个端点不在一条链上 第一种情况就直接得到答案 阅读全文
posted @ 2018-07-14 19:30 Aragaki 阅读(420) 评论(0) 推荐(0)