「CF911F」Tree Destruction
传送门
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的更多相关文章
- 「BZOJ2654」tree
		「BZOJ2654」tree 最小生成树+二分答案. 最开始并没有觉得可以二分答案,因为答案并不单调啊. 其实根据题意,白边的数目肯定大于need条,而最小生成树的白边数并不等于need(废话),可以 ... 
- 「AGC010F」 Tree Game
		「AGC010F」 Tree Game 传送门 切了一个 AGC 的题,很有精神. 于是决定纪念一下. 首先如果任意一个人在点 \(u\),他肯定不会向点权大于等于 \(a_u\) 的点走的,因为此时 ... 
- 「POJ3237」Tree(树链剖分)
		题意 给棵n个点的树.边有边权然后有三种操作 1.CHANGE i v 将编号为i的边权变为v 2.NEGATE a b 将a到b的所有边权变为相反数. 3.QUERY a b 查询a b路径的最大边 ... 
- LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree
		2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ... 
- CF911F Tree Destruction 解题报告
		CF911F Tree Destruction 题意翻译 给你一棵树,每次挑选这棵树的两个叶子,加上他们之间的边数(距离),然后将其中一个点去掉,问你边数(距离)之和最大可以是多少. 输入输出格式 输 ... 
- 「SPOJ10707」Count on a tree II
		「SPOJ10707」Count on a tree II 传送门 树上莫队板子题. 锻炼基础,没什么好说的. 参考代码: #include <algorithm> #include &l ... 
- 「SPOJ1487」Query on a tree III
		「SPOJ1487」Query on a tree III 传送门 把树的 \(\text{dfs}\) 序抠出来,子树的节点的编号位于一段连续区间,然后直接上建主席树区间第 \(k\) 大即可. 参 ... 
- 「luogu2633」Count on a tree
		「luogu2633」Count on a tree 传送门 树上主席树板子. 每个节点的根从其父节点更新得到,查询的时候差分一下就好了. 参考代码: #include <algorithm&g ... 
- 「AGC035C」 Skolem XOR Tree
		「AGC035C」 Skolem XOR Tree 感觉有那么一点点上道了? 首先对于一个 \(n\),若 \(n\equiv 3 \pmod 4\),我们很快能够构造出一个合法解如 \(n,n-1, ... 
随机推荐
- eclipse运用经验
			1.eclipse粘贴字符串添加转义符 2.eclipse的jdk版本切换 1.Window—Preferences—Java—Compiler—右侧面板设置为1.6 2.Window—Prefere ... 
- [学习笔记]用Python简易向喜欢的人表白
			前几天是情人节,就用Python图像库PIL来搞点事情. 先看图: 其实这样看不出什么来,然后需要放大: 放大以后就能看到你相对女神说的话. 但是对于学计算机的我来说,更想琢磨是怎样的流程完成的这个图 ... 
- word文档巧替换(空行替换、空格替换、软回车替换成硬回车)
			一.空行替换 在日常工作中,我们经常从网上下载一些文字材料,往往因空行多使得页数居高不下.一般方法是:在“编辑”菜单中打开“查找和替换”对话框(或按ctrl+H),在“查找内容”中输入“^p^p”“替 ... 
- python面试的100题(3)
			3.输入日期, 判断这一天是这一年的第几天? import datetime def dayofyear(): year = input("请输入年份: ") month = in ... 
- MySQL关于GTID的一些功能限制
			参考文献:https://www.cnblogs.com/luckcs/articles/6295992.html 更新非事务引擎: Case重现: master:对一个innodb表做一个多sql更 ... 
- 【PAT甲级】1113 Integer Set Partition (25分)
			题意: 输入一个正整数N(2<=N<=1e5),接着输入N个正整数,将这些数字划分为两个不相交的集合,使得他们的元素个数差绝对值最小且元素和差绝对值最大. AAAAAccepted cod ... 
- EAC3 Adaptive Hybrid Transform (AHT)
			adaptive hybrid transform 由两个linear transforms级联组成. 第一个transform为MDCT,MDCT使用KBD window产生256个transfor ... 
- js的一些基础
			事件对象: 就是用来存储事件相关的信息 事件对象存储信息有: 事件的类别,如:click,keydown等等 点击事件的位置 点击的哪一个键 等等 用于阻止事件流,用于阻止浏览器默认动作(表单提交.a ... 
- SSG (slow global), TTG (typical global) and FFG (fast global)
			https://semiwiki.com/x-subscriber/clk-design-automation/4481-variation-alphabet-soup/ n response, fo ... 
- MP4转mp3
			python实现: 依赖: glob,pydub "Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not wo ... 
