LCA
meopass
即使摸爬滚打,满身泥泞,我也要前进
展开
-
codeforces406D LCA+凸包
首先我们来想一下,如果两个山顶间有连边,意味着两座山中间没有任何一座山高于这两座山的连线。 加入从左到右三座山分别是p, q, r,这就意味着Kpq >= Kqr,否则q山将是不合法的,这其实就是在维护一个凸包。 接下来的问题是,我们需要能够到达当前能够到达的最右端的山峰,并且在这里我们能和团队中的另一个人相遇。 第一个问题我们可以反向维护一个下凸壳来解决,之后我们就得到了当前山峰能够到达的最原创 2017-08-16 15:42:09 · 333 阅读 · 0 评论 -
BZOJ 3123 LCA + 主席树 + 启发式合并
大致题意:有两种操作。 1. 查询节点x到节点y的路径上的第k小。 2. 连接点x和点y。需要离散化不必多说。 对于第一种操作,经典的LCA + 主席树问题。每次以父亲节点为上一版本建树,对于一次询问的答案就是在区间x−lca[x,y]+y−fa[lca[x,y]]x - lca[x, y] + y - fa[lca[x, y]]的答案。 对于第二种操作,每次启发式合并即可。对于新加入的点,原创 2017-09-18 15:17:06 · 463 阅读 · 0 评论 -
BZOJ 2588 LCA + 主席树
简略题意:树上路径第K大。经典的LCA + 主席树问题。每次以父亲节点为上一版本建树,对于一次询问的答案就是在区间x−lca[x,y]+y−fa[lca[x,y]]x - lca[x, y] + y - fa[lca[x, y]]的答案。A了这题可以看一下加强版。#include <bits/stdc++.h>#define all(x) x.begin(), x.end()using name原创 2017-09-19 20:11:13 · 331 阅读 · 0 评论 -
codeforces gym 101142G Gangsters in Central City
简略题意:一棵树,每个节点有一个局面,根是水源,边是水管。初始每个居民都有水喝。 操作有两种: ‘+ v’, v处的居民楼被强盗占领。 ‘- v’, v处的强盗走了。 对于每个询问,你需要切断一些水管,使得所有强盗没水喝,没水喝的居民尽量少。因为必须有边切才行,所以需要切除的边数最多就是与原来的根相连的边的数目。 原来的树拆成了若干个子树,每个子树的根也有一个边可以切除。单独考虑每个子树的原创 2017-10-07 18:06:13 · 368 阅读 · 0 评论 -
HDU 6200 边双联通分量 + 并查集 + dfs序 + BIT
简略题意:初始给出一张无向图,两种操作: 1. 添加一条(u,v)(u, v)的无向边。 2. 问从uu到vv的路径上的割边有多少。假若不考虑添加边的操作,问有多少割边,我们只需要边双联通缩个点成树,树上的每个边都是割边。从而转化成树上两点间距离。从根dfs一下转化成有根树的问题。现在考虑添加边的过程,其实就是再缩点的过程,先不考虑如何缩点,假如缩了点之后,我们就需要动态更新两点间距离了。对此我原创 2017-10-07 18:33:21 · 352 阅读 · 0 评论 -
HDU 6203 贪心 + LCA + dfs序 + BIT
简要题意:给出一个n+1n+1个点的树,以及若干个点对,需要断开一些点,使得这些点对路径不连通。输出应该断开的最少点数。我们断开一个点,能够影响到的是: 1.1.子树中过这个点的路径. 2.2.一个点在子树中,另一个点在祖先中的路径。为了使得以上两个影响尽可能的大,我们每次需要使得断开的点的子树尽可能大。 因此当我们打算断开一对点对(u,v)(u, v)的时候,为了使得断开的点的影响尽可能大,原创 2017-09-21 17:51:14 · 329 阅读 · 0 评论