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 ...
随机推荐
- python的pexpect模块
Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. P ...
- strsep strpbrk
#include <stdio.h> #include <string.h> int main(void) { char s[] = "aa,bb,cc.11,22, ...
- 三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)
这里能够简单的改动随意函数的返回地址.能够做到自己定义EIP的指向,就可以运行当前进程空间的随意指令,这里仅仅是让大家更清楚栈帧结构,没有涉及跨进程的inline HOOK 等,后面会陆续讲下读取随意 ...
- HDU Shell Necklace CDQ分治+FFT
Shell Necklace Problem Description Perhaps the sea‘s definition of a shell is the pearl. However, in ...
- iOS内存管理机制解析之MRC手动引用计数机制
前言: iOS的内存管理机制ARC和MRC是程序猿參加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5 ...
- Java IO、BIO、NIO、BIO
一.什么是IO/NIO: IO:即BIO(Blocking IO):面向流的.同步阻塞式IO:(JDK1.4之前唯一的选择) NIO:面向缓冲的.同步非阻塞式IO:三大核心部分:Selector.Ch ...
- Map实现缓存
为什么要使用缓存 缓存最终的目的是为减轻服务端压力,减少网络传输请求 客户端缓存 浏览器访问自带缓存~~ 页面缓存 浏览器缓存 App客户端缓存 IOS 前端开发 底层都有缓存技术的 ( ...
- codeforces 440B. Balancer 解题报告
题目链接:http://codeforces.com/problemset/problem/440/B 题目意思:给出 n 个数,求出这 n 个数的平均值avg,问对于这 n 个数里面中的每一个数,要 ...
- sid, pid, gid
(一) 参考 :https://unix.stackexchange.com/questions/18166/what-are-session-leaders-in-ps 命令: ps xao pid ...
- POJ1113:Wall (凸包:求最小的多边形,到所有点的距离大于大于L)
Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the ...