题目传送门

性质是:把节点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. Express:模板引擎深入研究

    深入源码 首先,看下express模板默认配置. view:模板引擎模块,对应 require('./view'),结合 res.render(name) 更好了解些.下面会看下 view 模块. v ...

  2. const *char p和char const *p

    const *char p和char const *p,const char*p的区别 char*const p——p必须初始化,且不能指向别处,即p是指针常量: char const*p——p指向的 ...

  3. npm ERR! code EINTEGRITY npm ERR! sha1- 报错解决办法

    npm ERR! code EINTEGRITY npm ERR! sha1- 报错日志 npm ERR! code EINTEGRITY npm ERR! sha1-OGchPo3Xm/Ho8jAM ...

  4. (linux)INIT_WORK和INIT_DELAYED_WORK详解

      朋友,你相信,一只蝴蝶在北京拍拍翅膀,将使得纽约几个月后出现比狂风还厉害的龙卷风吗?看过那部经典的影片蝴蝶效应的朋友们一定会说,这不就是蝴蝶效应吗.没错.蝴蝶效应其实是混沌学理论中的一个概念.它是 ...

  5. leelazero and google colab

    https://github.com/gcp/leela-zero/blob/master/COLAB.md 左侧菜单展开,可以查看细节

  6. e.target与e.currentTarget的区别

    在DOM事件对象中有两个属性总是时不时的困扰我,就是target和currentTarget,有时候很迷惑分不清两者的区别,因此有必要把这两个属性好好梳理一下,加深理解,以便日后的查询. MDN中对t ...

  7. 多线程、死锁、线程安全、同步方法、代码块、休眠、守护线程、Thread、Runnable(二十三)

    1.多线程的引入 * 1.什么是线程 * 线程是程序执行的一条路径, 一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率, 可以同时完成多项工作* 2.多线程的应用场景 * 红蜘蛛同时共 ...

  8. python数据分组运算

    摘要: pandas 的 GroupBy 功能可以方便地对数据进行分组.应用函数.转换和聚合等操作.   # 原作者:lionets GroupBy 分组运算有时也被称为 “split-apply-c ...

  9. JQuery操作TABLE,及console.info问题。

    还用alert 吗?看看console.info吧,代码的测试平台:ie9, firefox12 ​1. [代码][JavaScript]代码<!DOCTYPE html><html ...

  10. c#-关于自动属性的思考

    参考:c#-关于自动属性的思考 我的理解:自动属性跟 公有字段 一模一样,编程习惯而已.目前是这么认为的. 自动属性:public string Name{  get;  set } 公有字段:pub ...