题意:

给出一棵树,要求去掉k个点,使得剩下的还是一棵树,并且要求Σ(2^i)最大,i是剩下的节点的编号。

思路:

要使得剩下的点的2的幂的和最大,那么肯定要保住大的点,这是贪心。

考虑去掉哪些点的话,那么去掉一个点,它相连的子树的点肯定都得去掉,很麻烦。

所以放过来考虑保留哪些点,那么就从大到小考虑是否保留当前的点。并且把保留的点做标记。

首先n这个点是肯定可以保留的,标记,然后依次考虑n-1,n-2。。。1。

对于当前的点,判断是否已经被标记,如果没有被标记,那么就找到离当前点最远的没有被标记的祖先,如果要标记这个点,那么总共增加的点就是从当前点到离当前点最远的没有被标记的祖先的路径上的所有点的数量,也可以解释为当前点到已经保留的点所构成的树的路径上的点。

找这个路径的时候,暴力的话,n^2,肯定会T,所以可以首先用倍增预处理,再来找祖先,复杂度就可以下降为O(nlogn)。

如果这个数量没有超过要求,那么就把路径上的点全部标记。

最后没有标记的点就是要抛弃的点。

代码:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e6 + ;
int n,k;
vector<int> g[N];
int fa[N];
int dep[N];
bool vis[N];
int anc[N][];
void dfs(int u,int f)
{
fa[u] = f;
for (int v : g[u])
{
if (v != f)
{
dep[v] = dep[u] + ;
dfs(v,u);
}
}
}
void rdfs(int u,int f)
{
vis[u] = ;
if (u == f) return;
rdfs(fa[u],f);
}
void preprocess()
{
for (int i = ;i < n;i++)
{
anc[i][] = fa[i];
for (int j = ;(<<j) < n;j++) anc[i][j] = -;
}
for (int j = ;(<<j) < n;j++)
{
for (int i = ;i < n;i++)
{
if (anc[i][j-] != -)
{
int a = anc[i][j-];
anc[i][j] = anc[a][j-];
}
}
}
}
int main()
{
memset(anc,-,sizeof(anc));
scanf("%d%d",&n,&k);
k = n - k;
for (int i = ;i < n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x--,y--;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(n-,-);
preprocess();
int num = ;
vis[n-] = ;
for (int i = n - ;i >= ;i--)
{
if (vis[i]) continue;
int t = i;
for (int j = ;j >= ;j--)//j是从大到小枚举
{
if (anc[t][j] == -) continue;
else
{
if (!vis[anc[t][j]])
{
t = anc[t][j];
}
}
}
if (dep[i] - dep[t] + + num <= k)
{
num += dep[i] - dep[t] + ;
rdfs(i,t);
}
}
for (int i = ;i < n;i++)
{
if (!vis[i]) printf("%d ",i+);
}
return ;
}

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

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

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

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

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

  3. Codeforces 980 E. The Number Games

    \(>Codeforces \space 980 E. The Number Games<\) 题目大意 : 有一棵点数为 \(n\) 的数,第 \(i\) 个点的点权是 \(2^i\) ...

  4. Codeforces 55D Beautiful Number

    Codeforces 55D Beautiful Number a positive integer number is beautiful if and only if it is divisibl ...

  5. CF980E The Number Games

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

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

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

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

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

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

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

  9. codeforces Soldier and Number Game(dp+素数筛选)

    D. Soldier and Number Game time limit per test3 seconds memory limit per test256 megabytes inputstan ...

随机推荐

  1. 微信6.7.4 ios12 软键盘收回时页面不回弹,导致光标位置错乱,再次点击输入框区域时无法focus

    https://developers.weixin.qq.com/community/develop/doc/00044ae90742f8c82fb78fcae56800 https://blog.c ...

  2. 洛谷P4064 加法 [JXOI2017] 贪心

    正解:贪心 解题报告: 传送门! 首先最小值最大显然考虑二分?然后就二分一个值mid,从左往右考虑,对于小于等于mid的点显然可以求出这个点至少要加几次,然后找到覆盖这个点的右端点max的区间区间加上 ...

  3. 【Python基础】json.dumps()和json.loads()、json.dump()和json.load()的区分

    json文件处理涉及的四个函数json.dumps()和json.loads().json.dump()和json.load()的区分 一.概念理解 1.json.dumps()和json.loads ...

  4. python server

    #!/usr/bin/env python #coding=utf-8 # modifyDate: 20120808 ~ 20120810 # 原作者为:bones7456, http://li2z. ...

  5. jenkins 下载和安装

    jenkins 下载和安装 地址:http://jenkins.io/download/ 下载完成后,点击安装,安装完会发现电脑里多了个jenkins文件夹,打开发现 jenkins.war, 然后点 ...

  6. 运维自动化工具ansible

    企业级自动化运维工具应用实战ansible 公司计划在年底做一次大型市场促销活动,全面冲刺下交易额,为明年的上市做准备.公司要求各业务组对年底大促做准备,运维部要求所有业务容量进行三倍的扩容,并搭建出 ...

  7. 经典的js返回(退个页面)

    <a href="javascript:history.back()">返回</a> <a href="javascript:window. ...

  8. 快学Scala 2

    控制结构和函数 1.在Scala中,几乎所有构造出来的语法结构都有值.这个特性是为了使得程序更加精简,也更易读. (1)if表达式有值 (2)块也有值——是它最后一个表达式的值 (3)Scala的fo ...

  9. spring——事务管理

    1.spring支持编程式事务管理和声明式事务管理. 编程式事务管理:编程式事务管理使用TransactionTemplate或者直接使用最底层的PlatformTransactionManager. ...

  10. java.lang.UnsatisfiedLinkError: dlopen failed: library "libsqlite.so" not found

    项目在7.0以下系统的手机上运行正常,但在7.0的手机上运行异常. 出现这个问题的原因是:从 Android 7.0 开始,Android系统将阻止应用动态链接非公开 NDK 库. 解决方法有两种 第 ...