The Number Games CodeForces - 980E (树, 贪心)
大意: 给定$n$节点树, 求删除$k$个节点, 使得删除后还为树, 且剩余点$\sum{2^i}$尽量大
维护一个集合$S$, 每次尽量添加最大的点即可
这样的话需要支持求点到集合的最短距离, 直接用线段树进行子树更新就行了
就是说每次添加一个点$x$, 显然只会影响到$x$子树的距离
用线段树维护每个点在$S$中的祖先的最大深度$v$, 即用$dep[x]$更新$x$子树
则一个点$y$到$S$的最短距离就为$D=dep[y]-v[y]$
若剩余点大于等于$D$, 说明可以添加$y$, 否则再考虑比$y$小的点
复杂度$O(nlogn)$
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define pb push_back
#define mid ((l+r)>>1)
#define lc (o<<1)
#define rc (lc|1)
#define ls lc,l,mid
#define rs rc,mid+1,r
using namespace std; const int N = 1e6+10, INF = 0x3f3f3f3f;
int n, k, res, dep[N], vis[N];
int L[N], R[N], fa[N];
int v[N<<2];
vector<int> g[N]; void dfs(int x, int f) {
L[x]=++*L, dep[x] = dep[f]+1, fa[x]=f;
for (int y:g[x]) if (y!=f) {
dfs(y,x);
}
R[x]=*L;
} void upd(int o, int l, int r, int ql, int qr, int k) {
if (l>qr||r<ql||k<=v[o]) return;
if (ql<=l&&r<=qr) return v[o]=k,void();
upd(ls,ql,qr,k),upd(rs,ql,qr,k);
} int qry(int o, int l, int r, int x) {
if (l==r) return v[o];
v[lc]=max(v[lc],v[o]);
v[rc]=max(v[rc],v[o]);
if (mid>=x) return qry(ls,x);
return qry(rs,x);
} void add(int x) {
if (vis[x]) return;
--res;
vis[x] = 1, upd(1,1,n,L[x],R[x],dep[x]);
add(fa[x]);
} int main() {
scanf("%d%d", &n, &k);
REP(i,2,n) {
int x, y;
scanf("%d%d", &x, &y);
g[x].pb(y), g[y].pb(x);
}
dep[n] = -1, dfs(n,n);
vis[n] = 1;
res = n-k-1;
PER(i,1,n-1) if (!vis[i]) {
if (dep[i]-qry(1,1,n,L[i])>res) continue;
add(i);
if (!res) break;
}
REP(i,1,n) if (!vis[i]) printf("%d ", i);
puts("");
}
The Number Games CodeForces - 980E (树, 贪心)的更多相关文章
- Codeforces 980E The Number Games 贪心 倍增表
原文链接https://www.cnblogs.com/zhouzhendong/p/9074226.html 题目传送门 - Codeforces 980E 题意 $\rm Codeforces$ ...
- Codeforces 980 E. The Number Games
\(>Codeforces \space 980 E. The Number Games<\) 题目大意 : 有一棵点数为 \(n\) 的数,第 \(i\) 个点的点权是 \(2^i\) ...
- CF980E The Number Games【树链剖分/线段树】
CF980E The Number Games 题意翻译 Panel 国将举办名为数字游戏的年度表演.每个省派出一名选手. 国家有 n 个编号从 1 到 n 的省,每个省刚好有一条路径将其与其他省相连 ...
- CF980E The Number Games
CF980E The Number Games 给定一棵大小为 \(n\) 的树,第 \(i\) 个点的点权为 \(2^i\) ,删掉 \(k\) 个点及其连边,使得剩下的点组成一个连通块,且权值和最 ...
- poj3764(dfs+Trie树+贪心)
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值, ...
- BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心
BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...
- Bzoj5251 线段树+贪心
Bzoj5251 线段树+贪心 记录本蒟蒻省选后的第一篇题解!国际惯例的题面:首先这个东西显然是一棵树.如果我们把数值排序,并建立这棵树的dfs序,显然dfs序上的一个区间对应数值的一个区间,且根为数 ...
- 【NOI2015】荷马史诗[Huffman树+贪心]
#130. [NOI2015]荷马史诗 统计 描述 提交 自定义测试 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读 ...
- 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码
随机推荐
- 利用canvas来绘制一个会动的图画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SpringBoot——定时任务+WebSocket(问题)
开发环境:win7 + idea2018 + jdk 1.8 + springboot 2.x 记一次出现问题,我在项目中先集成了websocket环境,并且测试通过,之后想要模拟实时推送的效果,虽然 ...
- jackson 常用注解,比如忽略某些属性,驼峰和下划线互转
一般情况下使用JSON只使用了java对象与字符串的转换,但是,开发APP时候,我们经常使用实体类来做转换:这样,就需要用到注解: Jackson默认是针对get方法来生成JSON字符串的,可以使用注 ...
- 如何写出安全的 API 接口?接口参数加密签名设计思路
原文链接:http://blog.csdn.net/ma_jiang/article/details/53636840
- VC 线程池
参照:http://www.cnblogs.com/kzloser/archive/2013/03/11/2909221.html 参照:http://blog.csdn.net/pjchen/art ...
- TCP 的连接建立:采用三报文握手
- LOJ#2632. 「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On
题目描述 译自 BalticOI 2011 Day1 T3「Switch the Lamp On」有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会.有 N×M 个这样 ...
- LA 3486 Cells(判祖先+栈模拟dfs)
https://vjudge.net/problem/UVALive-3486 题意: 判断u是否是v的祖先. 思路: 很简单,dfs遍历,记录每个节点第一次访问时的时间戳 in[i] 和第二次访问时 ...
- urljoin
from urlparse import urljoin urljoin("http://www.asite.com/folder/currentpage.html", " ...
- 2:JavaScript中的基本运算
今天说的是JavaScript中的数据基本运算 在上一节中已经说了关于JavaScript中的基本数据类型 那么数据有了 剩下来就是数据之间的运算 表达式-------预算符(赋值 比较 算数 逻辑 ...