题目传送门:LOJ #2182。

题意简述:

一棵 \(n\) 个节点的树,边有边权。

每个点可能是关键点,每次操作改变一个点是否是关键点。

求所有关键点形成的极小联通子树的边权和的两倍。

题解:

有一个结论:DFS 序求出后,假设关键点按照 DFS 序排序后是 \(\{a_1,a_2,\ldots ,a_k\}\)。

那么所有关键点形成的极小联通子树的边权和的两倍等于 \(\mathrm{dist}(a_1,a_2)+\mathrm{dist}(a_2,a_3)+\cdots+\mathrm{dist}(a_{k-1},a_k)+\mathrm{dist}(a_k,a_1)\)。

画个图感性理解一下,应该是很好懂的。

那么求一下 DFS 序,每次操作相当于往集合里加入/删除一个元素。

假设插入 \(x\),它DFS序左右两边分别是 \(y\) 和 \(z\)。那么答案加上 \(\mathrm{dist}(x,y)+\mathrm{dist}(x,z)-\mathrm{dist}(y,z)\) 即可。

删除同理。还有,求 LCA 就用个倍增或者树剖吧,Tarjan 离线比较麻烦。

用 STL 自带的 set 容器维护起来很方便。你也可以手写树状数组/线段树/平衡树。

#include <cstdio>
#include <set>typedef long long LL;
const int MN = 100005;int N, M;
int h[MN], nxt[MN * 2], to[MN * 2], w[MN * 2], tot;
inline void ins(int x, int y, int z) {nxt[++tot] = h[x], to[tot] = y, w[tot] = z, h[x] = tot;
}int dfn[MN], idf[MN], dfc;
int dep[MN], faz[MN][17];
LL dis[MN];void DFS(int u, int fz) {dfn[u] = ++dfc; idf[dfc] = u; dep[u] = dep[faz[u][0] = fz] + 1;for (int j = 1; 1 << j < dep[u]; ++j) faz[u][j] = faz[faz[u][j - 1]][j - 1];for (int i = h[u]; i; i = nxt[i]) if (to[i] != fz) dis[to[i]] = dis[u] + w[i], DFS(to[i], u);
}inline int lca(int x, int y) {if (dep[x] < dep[y]) std::swap(x, y);for (int d = dep[x] - dep[y], j = 0; d; d >>= 1, ++j)if (d & 1) x = faz[x][j];if (x == y) return x;for (int j = 16; ~j; --j) if (faz[x][j] != faz[y][j])x = faz[x][j], y = faz[y][j];return faz[x][0];
}inline LL dist(int x, int y) { return dis[x] + dis[y] - 2 * dis[lca(x, y)]; }bool vis[MN];
std::set<int> st;
std::set<int>::iterator it;
LL Ans;int main() {scanf("%d%d", &N, &M);for (int i = 1, x, y, z; i < N; ++i) {scanf("%d%d%d", &x, &y, &z);ins(x, y, z), ins(y, x, z);}DFS(1, 0);for (int m = 1, x, y, z; m <= M; ++m) {scanf("%d", &x);x = dfn[x];if (!vis[idf[x]]) st.insert(x);y = idf[(it = st.lower_bound(x)) == st.begin() ? *--st.end() : *--it];z = idf[(it = st.upper_bound(x)) == st.end() ? *st.begin() : *it];if (vis[idf[x]]) st.erase(x);x = idf[x];LL d = dist(x, y) + dist(x, z) - dist(y, z);if (!vis[x]) vis[x] = 1, Ans += d;else vis[x] = 0, Ans -= d;printf("%lld\n", Ans);}return 0;
}

转载于:https://www.cnblogs.com/PinkRabbit/p/10356940.html

洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏相关推荐

  1. 【BZOJ 3991】 [SDOI2015]寻宝游戏

    3991: [SDOI2015]寻宝游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 251 Solved: 137 [Submit][Status ...

  2. SDOI2015寻宝游戏 dfs序+set

    SDOI2015寻宝游戏 好像是一道虚树入门题? 虚树???不会不会我弱死了.. Solution: 关键点间的最小路径,就是在保证尽量少走重复路的前提下走出来的一条经过所有关键点的路径. 基于这个思 ...

  3. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  4. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...

  5. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  6. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT

    题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...

  7. 洛谷 P4546 bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开

    题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...

  8. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美

    题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...

  9. 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route

    题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:"很 ...

最新文章

  1. 0x03.基本算法 — 前缀和与差分
  2. android 环形时间显示_使用Arduino构建OLED显示屏与Android手机接口的智能手表
  3. 循环结构格式 java
  4. C#LeetCode刷题之#169-求众数(Majority Element)
  5. 微软开源InnerEye:让医学影像AI普及化
  6. java多线程创建一个简单的案例
  7. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除(drop table #tableName)吗?...
  8. 页面显示拒绝访问请求
  9. iteritems python3_python3 items() 与 python2 中iteritems()的区别
  10. 面向对象PHP之Clone对象
  11. php正则表达式 w3c,正则表达式 – 匹配规则 | w3cschool菜鸟教程
  12. 用户画像项目两大核心内容之一“one_id”(含SQL实现代码)
  13. TCP/UDP端口列表
  14. WebStorm下载、安装、配置/2022最新版
  15. 哈佛大学凌晨4点半的景象--哈佛图书馆的二十条训言
  16. Linux scp远程文件/目录传输 用ps和grep命令寻找僵尸进程
  17. Because an app is obscuring a permission request, Settings can't verify your response
  18. Google BERT 中文应用之《红楼梦》中对话人物提取
  19. thinking php 教程,Thinkphp基础教程
  20. C语言十个数中求出平均值

热门文章

  1. 如何成为一名出色的次世代游戏美术师?
  2. 锻炼编程能力的10个游戏:通关既巅峰!
  3. 计算机视觉论文-2021-07-16
  4. Github | 商汤出品-可在视频里追踪单个对象PySOT
  5. 用eclipse开发android小程序,【转】Eclipse 开发Android小程序遇到的问题总结
  6. 排序算法对比、总结(Python代码)
  7. 深度学习(五十五)tensorflow分布式训练
  8. 词嵌入:探索解释和利用
  9. php html class,html中规定元素的类名的属性class
  10. Android开发实战二之Hello Android实例