题目传送门

性质是:把节点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序)的更多相关文章

  1. 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)

    题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...

  2. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  3. nowcoder172C 保护 (倍增lca+dfs序+主席树)

    https://www.nowcoder.com/acm/contest/172/C (sbw大佬太强啦 orz) 先把每一个路径(x,y)分成(x,lca),(y,lca)两个路径,然后就能发现,对 ...

  4. bzoj3991 lca+dfs序应用+set综合应用

    /* 给定一棵树,树上会出现宝物,也会有宝物消失 规定如果要收集树上所有宝物,就要选择一个点开始,到每个宝物点都跑一次,然后再回到那个点 现在给定m次修改,每次修改后树上就有一个宝物消失,或者一个宝物 ...

  5. BZOJ3881[Coci2015]Divljak——AC自动机+树状数组+LCA+dfs序+树链的并

    题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  6. Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)

    题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...

  7. 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 ...

  8. BZOJ3991:寻宝游戏 (LCA+dfs序+树链求并+set)

    小B最近正在玩一个寻宝游戏,这个游戏的地图中有N个村庄和N-1条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以任意选择一个村庄,瞬间转移到这个村庄,然后可以任意在地图的道路上行走 ...

  9. poj 2763(LCA + dfs序 +树状数组)

    算是模板题了 可以用dfs序维护点到根的距离 注意些LCA的时候遇到MAXM,要-1 #include<cstdio> #include<algorithm> #include ...

随机推荐

  1. 项目Beta冲刺(团队1/7)

    项目Beta冲刺(团队1/7) 团队名称: 云打印 作业要求: 项目Beta冲刺(团队) 作业目标: 完成项目Beta版本 团队队员 队员学号 队员姓名 个人博客地址 备注 221600412 陈宇 ...

  2. homebrew -v 或homebrew -doctor报错请检查 .bash_profile是否有误

    homebrew -doctor报错: /usr/local/Library/Homebrew/global.rb:109:in `split': invalid byte sequence in U ...

  3. Python开发【第6节】【文件操作】

    1.基本文件操作 open() 打开或者创建一个文件 格式:open('文件路径','打开模式') 返回值:文件io对象 打开模式一共N种: w模式 写模式write 文件不存在时会创建文件,如果文件 ...

  4. Codeforces Round #422 (Div. 2) A. I'm bored with life 暴力

    A. I'm bored with life     Holidays have finished. Thanks to the help of the hacker Leha, Noora mana ...

  5. HBase协处理器同步二级索引到Solr

    一. 背景二. 什么是HBase的协处理器三. HBase协处理器同步数据到Solr四. 添加协处理器五. 测试六. 协处理器动态加载 一. 背景 在实际生产中,HBase往往不能满足多维度分析,我们 ...

  6. java 提高效率的做法

    可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率.本文讨论的主要是如何提高代 ...

  7. eureka-注册中心使用密码验证

    spring cloud 1.1 版本之后可以使用 配置文件: bootstrap.yml server.port: 9000 spring.application.name: registry eu ...

  8. LCS模板

    时间复杂度O(m*n) #include <iostream> #include <cstring> #include <cstdlib> #include < ...

  9. 完美解决pip install scrapy,安装Scrapy错误:Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    1,在Python3.6 安装Scrapy 出现以下报错 2,错误分析 红色报的错误指向的是Twisted 1,Twisted 没安装上 2,Twisted 没安装成功 3,Twisted 版本与Py ...

  10. silverlight中 ComboBox绑定数据库,并获取当前选定值

    silverlight中 ComboBox绑定数据库,并获取当前选定值 在silverlight中 用combobox下拉菜单绑定数据库的方法和用DataGrid绑定数据库的方法类似. page.xa ...