\(>Codeforces \space 980 E. The Number Games<\)

题目大意 : 有一棵点数为 \(n\) 的数,第 \(i\) 个点的点权是 \(2^i\) 你需要删掉 \(k\) 个点,使得删掉这些点后树依然联通,且剩下的点权之和最大,并输出方案

\(n , k \leq 10^6\)

解题思路 :

问题可以转化为选取 \(n - k\) 个点,使得选取的点联通且权值和最大

根据点权是 \(2^i\) 的性质,显然有选取编号为 \(x\) 的点比选取 \(i = [1, x)\) 之间的所有点还要优

首先 \(n\) 一定要保留,于是可以将 \(n\) 设置为 \(root\) 把无根树变成有根树来简化问题

接下来不妨贪心的从大到小保留点,因为点权都是 \(2^i\) 所以一个点如果能选取就必然会被选取

考虑如果要选取一个点必然要选取他的所有祖先,所以一个点能否被选取取决于其到 \(root\) 的

路径上没有被选取的点的个数

所以对于一个点 \(x\) 只需要倍增找到其到 \(root\) 路径上最深的已经被选取的点 \(y\)

那么路径上没有被选取的点的个数就是 \(dep_x - dep_y\),如果可以选取就暴力选取这些点

因为每个点只会被最多选取一次,所以复杂度得以保证,总复杂度是 \(O(nlogn)\)

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define N (1000005)
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
vector<int> g[N];
int f[N][24], dep[N], ff[N], n, k;
inline void dfs(int u, int fa){
dep[u] = dep[fa] + 1, f[u][0] = fa;
for(int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if(v != fa) dfs(v, u);
}
}
inline int get(int x){
for(int i = 22; i >= 0; i--)
if(!ff[f[x][i]] && f[x][i]) x = f[x][i];
return x;
}
int main(){
read(n), read(k), k = n - k;
for(int i = 1, x, y; i < n; i++){
read(x), read(y);
g[x].push_back(y), g[y].push_back(x);
}
dfs(n, 0);
for(int j = 1; j <= 22; j++)
for(int i = 1; i <= n; i++)
f[i][j] = f[f[i][j-1]][j-1];
for(int i = n; i >= 1; i--) if(!ff[i]){
int u = i, ls = get(u);
if(dep[u] - dep[ls] + 1 <= k)
k -= dep[u] - dep[ls] + 1; else continue;
for(int s = u; s != ls; s = f[s][0]) ff[s] = 1;
ff[ls] = 1;
if(!k) break;
}
for(int i = 1; i <= n; i++)
if(!ff[i]) printf("%d ", i);
return 0;
}

Codeforces 980 E. The Number Games的更多相关文章

  1. [codeforces 325]B. Stadium and Games

    [codeforces 325]B. Stadium and Games 试题描述 Daniel is organizing a football tournament. He has come up ...

  2. Codeforces 455B A Lot of Games(字典树+博弈)

    题目连接: Codeforces 455B A Lot of Games 题目大意:给定n.表示字符串集合. 给定k,表示进行了k次游戏,然后是n个字符串.每局開始.字符串为空串,然后两人轮流在末尾追 ...

  3. CF980E The Number Games

    CF980E The Number Games 给定一棵大小为 \(n\) 的树,第 \(i\) 个点的点权为 \(2^i\) ,删掉 \(k\) 个点及其连边,使得剩下的点组成一个连通块,且权值和最 ...

  4. CF980E The Number Games【树链剖分/线段树】

    CF980E The Number Games 题意翻译 Panel 国将举办名为数字游戏的年度表演.每个省派出一名选手. 国家有 n 个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连 ...

  5. Codeforces 980E The Number Games 贪心 倍增表

    原文链接https://www.cnblogs.com/zhouzhendong/p/9074226.html 题目传送门 - Codeforces 980E 题意 $\rm Codeforces$ ...

  6. Codeforces 980E The Number Games - 贪心 - 树状数组

    题目传送门 传送点I 传送点II 传送点III 题目大意 给定一颗有$n$个点的树,$i$号点的权值是$2^{i}$要求删去$k$个点,使得剩下的点仍然连通,并且总权值和最大,问删去的所有点的编号. ...

  7. codeforces 980E The Number Games

    题意: 给出一棵树,要求去掉k个点,使得剩下的还是一棵树,并且要求Σ(2^i)最大,i是剩下的节点的编号. 思路: 要使得剩下的点的2的幂的和最大,那么肯定要保住大的点,这是贪心. 考虑去掉哪些点的话 ...

  8. Codeforces Round #480 (Div. 2) E - The Number Games

    题目大意:给你n个点的一棵树, 每个点的权值为2^i ,让你删掉k个点使得剩下的权值和最大. 思路:这题还是比较好想的, 我们反过来考虑, 剩下一个的情况肯定是选第n个点,剩下两个 我们肯定优先考虑第 ...

  9. The Number Games CodeForces - 980E (树, 贪心)

    链接 大意: 给定$n$节点树, 求删除$k$个节点, 使得删除后还为树, 且剩余点$\sum{2^i}$尽量大 维护一个集合$S$, 每次尽量添加最大的点即可 这样的话需要支持求点到集合的最短距离, ...

随机推荐

  1. 【51NOD】斜率最大

    [题解]通过画图易得结论:最大斜率一定出现在相邻两点之间. #include<cstdio> #include<algorithm> #include<cstring&g ...

  2. python初步学习-查看文档及数据类型转换

    学会查看文档 python最权威的文档就是官方文档,因此,我们要学会查看官方文档.而在python解释器中,help() 命令就可以很权威的查看官方文档. 因此,我们要学会使用 help() 命令. ...

  3. js_判断当前页面是否有网络和网络连接超时

    2018-04-12 方法一:通过navigator.onLine属性判断,返回true为有联网状态,false为断网状态. //方法一 if(navigator.onLine) { console. ...

  4. web-project 故障查看功能 检测是否启动fmd服务

    def check_fmd_service(): try: output = subprocess.check_output('svcs -H -o state fmd',shell=True) st ...

  5. Python模块学习 - pyinotify

    pyinotify介绍 pyinotify模块用来监测文件系统的变化,依赖于Linux内核的inotify功能,inotify是一个事件驱动的通知器,其通知接口从内核空间到用户空间通过三个系统调用.p ...

  6. python基础===python基础知识问答(转)

    1.到底什么是Python?你可以在回答中与其他技术进行对比 Python是一种解释型语言.与C语言和C的衍生语言不同,Python代码在运行之前不需要编译.其他解释型语言还包括PHP和Ruby. P ...

  7. JSON对象与字符串之间的相互转换

    <html> <head> <meta name="viewport" content="width=device-width" ...

  8. VO、DTO、DO、PO的概念、区别和用处

    转至:http://qixuejia.cnblogs.com/ 本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概 ...

  9. aspxpivotgrid 导出excel时,非绑定咧显示为0的情况

    using DevExpress.XtraPrinting; Exporter.ExportXlsToResponse(this.Title,TextExportMode.Text,true); // ...

  10. [].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) })

    问问你自己,看得懂这行代码吗?要是看不懂就点击进来看看吧,要是看的懂得话,可以绕路 1.call:call(thisObj,arg1,arg2,arg3) [].forEach.call($$(&qu ...