传送门

Luogu

解题思路

显然的贪心策略,因为每次都要尽量使得删点后的收益最大。

我们可以求出树的直径(因为树上的任意一个节点与其距离最远的点一定是直径的端点)。

然后我们对于所有不是直径上的点,从叶子开始,从下往上删点,最后再由深而浅删掉直径。

最后输出答案即可。

细节注意事项

  • 有些地方的计算不要写错式子之类的

参考代码

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#include <queue>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= (c == '-'), c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
} typedef long long LL;
const int _ = 200010;
const int __ = 400010; int tot, head[_], nxt[__], ver[__];
inline void Add_edge(int u, int v)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; } int n, rt, lf, mark[_], fa[_], dep[_];
queue < pair < int, int > > Q; inline void dfs1(int u, int f) {
for (rg int i = head[u]; i; i = nxt[i]) {
int v = ver[i]; if (v == f) continue;
dep[v] = dep[u] + 1, dfs1(v, u);
}
} inline void dfs2(int u, int f) {
for (rg int i = head[u]; i; i = nxt[i]) {
int v = ver[i]; if (v == f) continue;
fa[v] = u, dfs2(v, u), mark[u] |= mark[v];
}
} LL ans = 0; inline void dfs3(int u, int f, int lca) {
for (rg int i = head[u]; i; i = nxt[i]) {
int v = ver[i]; if (v == f) continue;
dfs3(v, u, mark[v] ? v : lca);
}
if (!mark[u]) {
if (dep[u] > dep[u] + dep[lf] - 2 * dep[lca])
ans += dep[u], Q.push(make_pair(rt, u));
else
ans += dep[u] + dep[lf] - 2 * dep[lca], Q.push(make_pair(lf, u));
}
} int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
read(n);
for (rg int u, v, i = 1; i < n; ++i)
read(u), read(v), Add_edge(u, v), Add_edge(v, u);
dep[1] = 0, dfs1(1, 0);
rt = 1;
for (rg int i = 1; i <= n; ++i)
if (dep[i] > dep[rt]) rt = i;
dep[rt] = 0, dfs1(rt, 0);
lf = rt;
for (rg int i = 1; i <= n; ++i)
if (dep[i] > dep[lf]) lf = i;
mark[lf] = 1;
dfs2(rt, 0);
dfs3(rt, 0, rt);
for (rg int i = lf; i != rt; i = fa[i])
ans += dep[i], Q.push(make_pair(rt, i));
printf("%lld\n", ans);
while (!Q.empty()) {
pair < int, int > x = Q.front(); Q.pop();
printf("%d %d %d\n", x.first, x.second, x.second);
}
return 0;
}

完结撒花 \(qwq\)

「CF911F」Tree Destruction的更多相关文章

  1. 「BZOJ2654」tree

    「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ...

  2. 「AGC010F」 Tree Game

    「AGC010F」 Tree Game 传送门 切了一个 AGC 的题,很有精神. 于是决定纪念一下. 首先如果任意一个人在点 \(u\),他肯定不会向点权大于等于 \(a_u\) 的点走的,因为此时 ...

  3. 「POJ3237」Tree(树链剖分)

    题意 给棵n个点的树.边有边权然后有三种操作 1.CHANGE i v 将编号为i的边权变为v 2.NEGATE a b 将a到b的所有边权变为相反数. 3.QUERY a b 查询a b路径的最大边 ...

  4. LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree

    2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  5. CF911F Tree Destruction 解题报告

    CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ...

  6. 「SPOJ10707」Count on a tree II

    「SPOJ10707」Count on a tree II 传送门 树上莫队板子题. 锻炼基础,没什么好说的. 参考代码: #include <algorithm> #include &l ...

  7. 「SPOJ1487」Query on a tree III

    「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ...

  8. 「luogu2633」Count on a tree

    「luogu2633」Count on a tree 传送门 树上主席树板子. 每个节点的根从其父节点更新得到,查询的时候差分一下就好了. 参考代码: #include <algorithm&g ...

  9. 「AGC035C」 Skolem XOR Tree

    「AGC035C」 Skolem XOR Tree 感觉有那么一点点上道了? 首先对于一个 \(n\),若 \(n\equiv 3 \pmod 4\),我们很快能够构造出一个合法解如 \(n,n-1, ...

随机推荐

  1. JSON解析及数据库操作实战篇

    代码: JSONObject json = JSONObject.parseObject(ubody);//得到整个json JSONObject AutoTable=json.getJSONObje ...

  2. Windows下Go安装&环境配置&编译运行

    Go下载安装 官方Go下载站点:https://golang.google.cn/ 也可以选择:https://studygolang.com/dl 配置环境变量 常用环境变量 GOROOT GORO ...

  3. 用OpenCV读取摄像头

    首先插入摄像头 在电脑中查看 #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp ...

  4. css各类选择器类型和用法

    1.ID 选择器(ID selector,IS):使用 # 标识selector,语法格式:#S{...}(S为选择器名).例:id为name的标签会匹配下面的样式 <style> #na ...

  5. 矩阵快速幂 裸 hdu1575

    裸题,求A^n次后的对角线数字之和 #include<cstdio> #include<algorithm> #include<string.h> using na ...

  6. layui-form下隐藏元素的验证问题

    1.情景: 设置为display:none的必填字段,在点击提交(form 包含 class="layui-form":button包含属性 lay-submit)的时候,依旧验证 ...

  7. GitHub的安装和第一次上传本地项目

    网站的新用户注册:http://www.github.com 安装:下载之后安装,一路下一步就可以了,安装完成后打开Git Bash,进入bash界面. 邮箱注册: $ git config --gl ...

  8. RNGCryptoServiceProvider 生成订单号

    先生成1~1000的随机数 class Program { // Create a new instance of the RNGCryptoServiceProvider. private stat ...

  9. QT+VS中使用qDebug()打印调试信息无法显示

    首先右键点击项目名称,找到最后一项属性 然后依次设置为如图所示即可 再次编译后,会弹出CMD窗口,出现qDebug的调试信息.

  10. jmeter实现SMTP邮件协议压测

    实现目的 通过jmeter的SMTP取样器,调用SMTP协议,批量进行邮件的发送,已达到压测的目的. 脚本实现 User Defined Variables定义用户变量 编辑SMTP Sampler取 ...