正题

题目链接:https://www.luogu.org/problem/CF613D


题目大意

一棵树,每次询问kkk个点,删除mmm个点要这些点两两不连通,求mmm的最小值。


解题思路

我们可以对于询问的点构造一颗虚树,然后进行贪心选取即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110000;
struct node{int to,next;
}a[2*N];
int n,siz[N],dep[N],son[N],top[N],fa[N];
int tot,ls[N],p[N],ans,cnt,s[N],q,dfn[N],num;
void adde(int x,int y)
{if(x==y) return;a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void dfs1(int x)
{siz[x]=1;dfn[x]=++num; for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa[x]) continue;dep[y]=dep[x]+1;fa[y]=x;dfs1(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y; }
}
void dfs2(int x,int fa)
{if(son[x]){top[son[x]]=top[x];dfs2(son[x],x);}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa||y==son[x]) continue;top[y]=y;dfs2(y,x);}
}
int LCA(int x,int y)
{while(top[x]!=top[y])if(dep[top[x]]<dep[top[y]]) y=fa[top[y]];else x=fa[top[x]];if(dep[x]<dep[y]) return x;return y;
}
void ins(int x)
{if(!cnt){s[++cnt]=x;return;}int lca=LCA(s[cnt],x);while(cnt>1&&dep[lca]<dep[s[cnt-1]]){adde(s[cnt-1],s[cnt]),cnt--;}if(dep[lca]<dep[s[cnt]]) adde(lca,s[cnt--]);if((!cnt)||(s[cnt]!=lca)) s[++cnt]=lca;s[++cnt]=x;
}
void dp(int x)
{if(siz[x]){for(int i=ls[x];i;i=a[i].next){int y=a[i].to;dp(y);if(siz[y]){siz[y]=0;ans++;}}}else{for(int i=ls[x];i;i=a[i].next){int y=a[i].to;dp(y);siz[x]+=siz[y];siz[y]=0;}if(siz[x]>1){ans++;siz[x]=0;}}ls[x]=0;
}
bool cmp(int x,int y)
{return dfn[x]<dfn[y];}
int main()
{scanf("%d",&n);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);adde(x,y);adde(y,x);}dfs1(1);top[1]=1;dfs2(1,1);tot=0;memset(siz,0,sizeof(siz));memset(ls,0,sizeof(ls));scanf("%d",&q);while(q--){int k;cnt=0;ans=0;scanf("%d",&k);p[0]=1;for(int i=1;i<=k;i++){scanf("%d",&p[i]);siz[p[i]]++;}for(int i=1;i<=k;i++)if(siz[fa[p[i]]]){puts("-1");p[0]=0;break;}if(!p[0]){for(int i=1;i<=k;i++)siz[p[i]]--;continue;}sort(p+1,p+1+k,cmp);if(p[1]!=1) s[++cnt]=1;for(int i=1;i<=k;i++) ins(p[i]);while(cnt>1) adde(s[cnt-1],s[cnt]),cnt--;dp(1);siz[1]=tot=0;printf("%d\n",ans);}
}

CF613D-Kingdom and its Cities【虚树,LCA,树链剖分,贪心】相关推荐

  1. 题解 - CF613D Kingdom and its Cities

    题解 - C F 613 D K i n g d o m a n d i t s C i t i e s \mathrm{CF613D \ Kingdom \ and \ its \ Cities} ...

  2. HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)

    题目链接:点击查看 题目大意:给出一个由n个点和n条边组成的图,每条边都有权值,题目保证图是连通的,然后给出m个询问,每次询问分为两种形式: 0 x y:将第x条边的权值修改为y 1 x y:查询x- ...

  3. CodeForces - 613D Kingdom and its Cities(虚树+贪心)

    题目链接:点击查看 题目大意:给出一棵 n 个结点组成的树,有多组询问,每组询问给出 k 个点,现在可以删除不同于 k 个节点的 m 个节点,使得这 k 个节点两两不连通,要求最小化 m ,如果不可能 ...

  4. CF613D Kingdom and its Cities

    题目描述: luogu cf 题解: 虚树上dp. 建虚树没啥说的. 那么dp状态? 考虑dfs时返回一个值,代表这个子树上面需不需要隔断. 如果当前点可以占,那么有至少两个这种子树时应该选这个点并返 ...

  5. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  6. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...

    原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...

  7. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  8. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  9. POJ - 1330 Nearest Common Ancestors(树上倍增/树链剖分求LCA)

    题目链接:点击查看 题目大意:给出一棵有根树,我们需要求出两个点的lca 题目分析:因为题目说了是有根树,所以我们在建图的时候直接建有向图就好了,并且记录一下每个点的入度,建完图后找一下入度为0的点, ...

最新文章

  1. 重磅:国家正式出台学术不端行为界定
  2. sap 教学视频网址
  3. unix环境高级编程-线程(2)
  4. exportfs命令、NFS客户端问题、FTP介绍、使用vsftpd搭建ftp
  5. 2/2 常用函数:标准库函数
  6. react-性能优化
  7. 专题:生物医疗大数据
  8. .so文件反编译_java加密防止反编译-VirboxProtector
  9. flutter DateTime 日期时间详细解析 Dart语言基础
  10. 判断上三角矩阵 (15 分)
  11. Redis锁的简单应用
  12. codeforces C. Ryouko's Memory Note
  13. Vosviewer图谱相关指标详细解释1
  14. 百宝云在线表单云平台
  15. php的在线问卷调查_php 在线问卷调查程序一
  16. java excel 边框颜色_java(jxl) 改变excel表格背景及边框
  17. C#实现在图片上添加文字和二维码
  18. python 3d绘图立方体_用python绘制三维立方体的二维投影
  19. webp文件_什么是WebP文件(以及如何打开一个文件)?
  20. 利用setTimeout实现setInterval

热门文章

  1. java实现数字转mac,Java Ethernet.getSourceMAC方法代码示例
  2. mysql索引有几种使用索引的好处_mysql索引的类型和优缺点
  3. matlab创建数组对象,MATLAB一维数组(向量)的定义
  4. android.mk ndk编译选项优化,Android NDK 编译脚本分析 之一
  5. 怎么打包图片_超简单的免费批量图片压缩技巧,只需3步
  6. 读数据库遇到空就进行不下去_如何保证缓存与数据库的双写一致性?
  7. sql计算留存_SQL基础第七讲:关于用户留存率的计算
  8. 数据结构——图-最短路径长度中最大的一个
  9. 高考英语口试计算机系,大学英语口语考试都考什么,高考英语口试考什么?
  10. [Swagger2]分组和接口注释及小结