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 ...
随机推荐
- bzoj 1088 简单dfs
/* 题意:给你一列仅仅能取0和1的数. 限制:每3个相邻的数的值固定,开头和结尾仅仅限制两个数 求:有多少种组合方案 解:搜索,在开头和结尾再加一个仅仅能取零的数,直接推断是否符合条件就可以 */ ...
- 有遍历struct中字段信息的函数或方法
例:struct a{int a;char b[10];double c;}; 在程序中只知道一个结构 a 的指针, 有没有函数能通过结构的名字 和 指向结构的指针 随次得到 结构中的变量类型 和 变 ...
- 利用BADI WORKORDER_INFOSYSTEM在COOIS中加入自己定义列办事处
需求描写叙述:依据LC业务部门提出的需求.须要在COOIS中加入办事处一列. 1.在IOHEADER_TAB的CI_IOHEADER中加入字段办事处.如以下图所看到的: watermark/2/t ...
- SequenceFile
org.apache.hadoop.io包里的SequenceFile类提供了高效的二进制文件格式,它经常用于MapReduce作业的输出.尤其是当作业的输出被当做另一个作业的输入时.Sequence ...
- intellij IDEA 更新java后不用重启tomcat
最近项目大了,每次修改后重启都要等和很久,那个煎熬…… 为了解决这个问题,万能的Google 装了这个 JREBEL 5.63最新的 安装步骤: 一.IDEA在线搜索 jrebel 安装 二.破 ...
- 新手必备的SEO优化工具
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
- yarn笔记
常用命令: 创建项目:yarn init 安装依赖包:yarn == yarn install 添加依赖包:yarn add Yarn命令列表 命令 操作 参数 标签 yarn add 添加依赖包 包 ...
- HDU3081 Marriage Match II —— 传递闭包 + 二分图最大匹配 or 传递闭包 + 二分 + 最大流
题目链接:https://vjudge.net/problem/HDU-3081 Marriage Match II Time Limit: 2000/1000 MS (Java/Others) ...
- AutoEventWireup
Page_PreInit & OnPreInit - whats the difference? https://forums.asp.net/t/1095903.aspx?Page_PreI ...