原文链接https://www.cnblogs.com/zhouzhendong/p/9074226.html

题目传送门 - Codeforces 980E

题意

  $\rm Codeforces$ 真是个令人伤心的地方。

  伤心的 $zzd$ 给你一个有 $n$ 个节点的树,编号为 $i$ 的节点权值为 $2^i$。

  让你砍掉其中 $k$ 个节点,使得剩余的所有节点都连通,并最大化剩余节点的权值和。输出方案。

  $n\leq 10^6$

题解

  伤心的 $zzd$ 再一次来到了令人伤心的 $\rm Codeforces$,并开心的 $9$ 分钟敲完并 $AC$ 了此题,并再一次伤心地发现这是在 $vp$ 结束后的第 $4$ 分钟。

  我们考虑选择一颗子树,使得剩余节点的权值和最大。

  显然我们可以贪心编号从大到小选择,能选就选。

  考虑当前选出的子树状态为 $S$,下一个决策为节点 $i$ ,那么,新增的节点数就是节点 $i$ 到 $S$ 的距离。

  只要新增之后不超出限制就可以了。

  这个东西可以预处理倍增表来快速搞定。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=1000005;
struct gragh{
int cnt,y[N*2],nxt[N*2],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b){
y[++cnt]=b,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,lim,depth[N],fa[N],anst[N][21];
int vis[N],tot=0,ans[N];
void dfs(int x,int pre){
fa[x]=anst[x][0]=pre;
depth[x]=depth[pre]+1;
for (int i=1;i<=20;i++)
anst[x][i]=anst[anst[x][i-1]][i-1];
for (int i=g.fst[x];i;i=g.nxt[i])
if (g.y[i]!=pre)
dfs(g.y[i],x);
}
int main(){
scanf("%d%d",&n,&lim);
lim=n-lim;
g.clear();
for (int i=1,a,b;i<n;i++){
scanf("%d%d",&a,&b);
g.add(a,b),g.add(b,a);
}
dfs(n,0);
memset(vis,0,sizeof vis);
vis[n]=tot=1;
vis[0]=1;
for (int i=n-1;i>=1;i--){
if (vis[i])
continue;
int j=i;
for (int k=20;k>=0;k--)
if (!vis[anst[j][k]])
j=anst[j][k];
if (tot+depth[i]-depth[j]+1>lim)
continue;
tot+=depth[i]-depth[j]+1;
vis[j]=1;
for (int k=i;k!=j;k=fa[k])
vis[k]=1;
}
tot=0;
for (int i=1;i<=n;i++)
if (!vis[i])
ans[++tot]=i;
for (int i=1;i<=tot;i++)
printf("%d ",ans[i]);
return 0;
}

  

Codeforces 980E The Number Games 贪心 倍增表的更多相关文章

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

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

  2. codeforces 980E The Number Games

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

  3. Codeforces 983E - NN country(贪心+倍增优化)

    Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我 ...

  4. Codeforces 980 E. The Number Games

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

  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. Codeforces 55D Beautiful Number

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

  8. NOI2018Day1T1 归程 并查集 kruskal kruskal重构树 倍增表 Dijkstra

    原文链接https://www.cnblogs.com/zhouzhendong/p/NOI2018Day1T1.html 题目传送门 - 洛谷P4768 题意 给定一个无向连通图,有 $n$ 个点 ...

  9. codeforces Gym 100338E Numbers (贪心,实现)

    题目:http://codeforces.com/gym/100338/attachments 贪心,每次枚举10的i次幂,除k后取余数r在用k-r补在10的幂上作为候选答案. #include< ...

随机推荐

  1. Docker入门 - 006 Docker 多种数据库的安装

    Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...

  2. Solidity(address的四个方法)

    address的四个方法send,call,callcode,delegatecall 例子:发送以太币的send方法//下面是send方法,涉及到以太币的情况可能用到payable,senddemo ...

  3. Go语言环境安装&搭建(Linux)

    Linux的东西果然不记不行啊~ 下载&安装 下载 我们先找到linux版的下载链接 https://golang.org/dl/ 打开网址找到Linux对应的链接右键复制下载地址 然后连接服 ...

  4. Python中join()函数方法

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下:    join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字 ...

  5. 配置一个 Confluence 6 环境

    本部分对你 Confluence 的外部设置进行描述.包括有如何配置 Web 服务器,应用服务器,目录和文件等信息—— Confluence 运行所需要的所有环境.有关在服务器内部对配置进行修改的内容 ...

  6. Confluence 6 中修改默认的表现和内容

    Confluence 构建了一些有用的默认设置,这些设置能够让第一次访问使用 Confluence 系统的用户更好的了解系统.同时默认的内容将新空间和其他区域放置在 Confluence 中. Con ...

  7. 广工赛-hdu6470矩阵快速幂

    递推时把(n+1)^3拆开 构造矩阵即可 #include<bits/stdc++.h> using namespace std; #define ll long long #define ...

  8. binlog2sql之MySQL数据闪回实践

    DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...

  9. java web 项目中 简单定时器实现 Timer

    java web 项目中 简单定时器实现 Timer 标签: Java定时器 2016-01-14 17:28 7070人阅读 评论(0) 收藏 举报  分类: JAVA(24)  版权声明:本文为博 ...

  10. win(64位)环境下oracle11g的安装方法

    将压缩文件解压到一个目录中,该目录结构如下: 安装步骤(摘自网络): 1.进入数据库解压目录,双击其中的“setup.exe”文件,稍等片刻出现如下“配置安全更新“界面,取消“我希望通过My Orac ...