原文链接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;
}

  

最新文章

  1. 最新Linux部署.NET,Mono and DNX
  2. 类型基础---CLR Via C#笔记一
  3. RSA密钥,JAVA与.NET之间转换
  4. Python单元测试和Mock测试
  5. Dripicons – 精美的扁平风格的免费矢量图标字体
  6. 验证进入AppStore的评分界面
  7. [LeetCode]题解(python):100 Same Tree
  8. 2.Nexus更新索引
  9. **PHP随机数算法
  10. GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态
  11. LRU 缓冲池 (不考虑多线程)
  12. node to traverse cannot be null!
  13. wampserver图标黄色
  14. JTree事件
  15. 转:NSString什么时候用copy,什么时候用strong
  16. xtrabackup 2.0.8备份mysql5.1.65报错
  17. MySQL二进制日志总结
  18. java排序算法(八):希尔排序(shell排序)
  19. 002-如何理解Java的平台独立性
  20. 练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪)

热门文章

  1. mina使用总结
  2. eclipse:显示堆内存
  3. android开机动画(bootanimation)
  4. Spring initializr使用
  5. 获得小程序码getWXACodeUnlimit
  6. js——prototype、__proto__、constructor
  7. swift 学习- 13 -- 下标
  8. 第二十单元 计划任务crond服务
  9. Nginx详解十七:Nginx深度学习篇之动静分离
  10. 性能测试四十九:ngrinder压测平台