CH#56C(LCA+dfs序)
性质是:把节点dfs序以后,异象石按这个序号排序,然后相邻两两求树上距离,这些距离的和除以二就是最小斯坦纳树。
插入删除的具体操作是根据我们上述性质,用一个set维护dfn,比如插入x,则ans加上:(set里的,即之前已经插进来的)左x + x右 - 左右。
const int maxn = 1e5 + ;
typedef set<ll> S;
typedef S::iterator Sit; int n, m, t, tot, Time;
int head[maxn], to[maxn << ], nxt[maxn << ];
int dfn[maxn], mp[maxn];
ll val[maxn << ], dis[maxn][]; int f[maxn][], d[maxn]; S s;
ll ans; inline void add(int u, int v, ll cost) {
to[++tot] = v, val[tot] = cost, nxt[tot] = head[u], head[u] = tot;
} inline void bfs() {
queue<int> Q;
Q.push(), d[] = ; while (!Q.empty()) {
int x = Q.front(); Q.pop(); for (int i = head[x]; i; i = nxt[i]) {
int y = to[i];
if (d[y]) continue; d[y] = d[x] + ;
dis[y][] = val[i];
f[y][] = x; rep(j, , t) {
f[y][j] = f[f[y][j - ]][j - ];
dis[y][j] = dis[f[y][j - ]][j - ] + dis[y][j - ];
} Q.push(y);
}
}
} inline void dfs(int cur, int fa) {
dfn[cur] = ++Time;
mp[Time] = cur; for (int i = head[cur]; i; i = nxt[i]) {
int v = to[i];
if (v == fa) continue;
dfs(v, cur);
}
} inline Sit getL(Sit it) {
if (it == s.begin()) return --s.end();
return --it;
} inline Sit getR(Sit it) {
if (it == --s.end()) return s.begin();
return ++it;
} inline ll lca(int x, int y) {
ll ret = ; if (d[x] > d[y]) swap(x, y); irep(i, t, )
if (d[f[y][i]] >= d[x]) {
ret += dis[y][i];
y = f[y][i];
} if (x == y) return ret; irep(i, t, )
if (f[x][i] != f[y][i]) {
ret += dis[x][i] + dis[y][i];
x = f[x][i], y = f[y][i];
} return ret + dis[x][] + dis[y][];
} int main() {
read(n);
rep(i, , n - ) {
int u, v;
ll cost;
read(u), read(v), read(cost);
add(u, v, cost), add(v, u, cost);
} t = (int)(log(n) / log()) + ;
bfs();
dfs(, ); read(m);
rep(i, , m) {
char str[];
scanf("%s", str); if (str[] == '?') {
writeln(ans / );
} else {
int x;
read(x); if (str[] == '+') {
if (s.size()) {
Sit R = s.lower_bound(dfn[x]);
if (R == s.end()) R = s.begin();
Sit L = getL(R); ans += lca(mp[*L], x) + lca(x, mp[*R]) - lca(mp[*L], mp[*R]);
}
s.insert(dfn[x]);
} else {
Sit it = s.find(dfn[x]);
Sit L = getL(it), R = getR(it); ans -= lca(mp[*L], x) + lca(x, mp[*R]) - lca(mp[*L], mp[*R]);
s.erase(it);
}
}
} return ;
}
CH#56C(LCA+dfs序)的更多相关文章
- 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)
题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- nowcoder172C 保护 (倍增lca+dfs序+主席树)
https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...
- bzoj3991 lca+dfs序应用+set综合应用
/* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物 ...
- BZOJ3881[Coci2015]Divljak——AC自动机+树状数组+LCA+dfs序+树链的并
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...
- HDU 6203 ping ping ping(贪心+LCA+DFS序+BIT)
ping ping ping Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- BZOJ3991:寻宝游戏 (LCA+dfs序+树链求并+set)
小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路上行走 ...
- poj 2763(LCA + dfs序 +树状数组)
算是模板题了 可以用dfs序维护点到根的距离 注意些LCA的时候遇到MAXM,要-1 #include<cstdio> #include<algorithm> #include ...
随机推荐
- 命令行添加PATH
如何设置PATH 命令:echo "export PATH=xxxxxx:$PATH" >> ~/.bash_profile 解释:把"export PATH ...
- OpenGL之路(五)制作旋转飞机模型
#include <gl/glut.h> #include <gl/GLU.h> #include <gl/GL.h> #pragma comment(lib, & ...
- CSS3 的10种Loading
昨晚用CSS3实现了几种常见的Loading效果,虽然很简单,但还是分享一下,顺便也当是做做笔记…… 第1种效果: 代码如下: <div class="loading"> ...
- HDU2089 不要62 —— 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others) M ...
- POJ2251 Dungeon Master —— BFS
题目链接:http://poj.org/problem?id=2251 Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total S ...
- YTU 2391: 求素数
2391: 求素数 时间限制: 1 Sec 内存限制: 128 MB 提交: 116 解决: 3 题目描述 设计一个程序,输出所有小于等于n(n为一个大于2的正整数)的素数. 要求:(1)每行输出 ...
- 3种方法判断手机浏览器跳转WAP手机网站
随着移动设备的普及,企业的网络宣传已经不能局限在PC端,而需要同时在移动端有所建树.对于公司网站来说,以前都是做的PC端的,当然手机等移动端也可以访问,但是用户体验肯定不如完全适合的手机端来的方便.我 ...
- Navicat——如何导出所有的查询数据
前言 很简单就是通过Navicat的查询来查询~ 步骤 真的不要太简单了~ 打开Navicat并点击查询 新建查询 选择对应的连接和库 写入SQL并运行 导出结果 1.选择导出当前的结果 2.选择保存 ...
- 更改NavigationView侧滑菜单文字颜色
NavigationView menu默认icon和title会随着菜单状态改变而改变,选择某个菜单后再次打开侧边菜单后会发现该菜单的icon和title会变成应用的主颜色,其他菜单项仍然为黑色. 如 ...
- WPF 之Converter
WPF 之Converter Leo 在我们做项目的时候,经常会遇见这样的事情: 在数据中我们定义的是true,false 而在现实的时候则可能要求男,女 我们还得能定义成了0,1,2,3,4,5, ...