BZOJ 1086 王室联邦
http://www.lydsy.com/JudgeOnline/problem.php?id=1086
思路:贪心,每次当储存的儿子大于等于B时,分出一个块,这样每次每个块至多为2B,这样剩下的没有被分的块小于B,可以加入任意一个块,都是合法的。
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
int tot,go[],first[],next[],n,m;
int top,c[],pd,size[],cap[],belong[],sz;
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
}
void add(int x,int y){
insert(x,y);insert(y,x);
}
void dfs(int x,int fa){
c[++top]=x;
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (pur==fa) continue;
dfs(pur,x);
if (size[x]+size[pur]>=m){
cap[++sz]=x;size[x]=;
while (c[top]!=x) belong[c[top--]]=sz;
}else size[x]+=size[pur];
}
size[x]++;
}
void find(int x,int fa){
if (belong[x]) {
pd=belong[x];
return;
}
for (int i=first[x];i;i=next[i]){
int pur=go[i];
if (pur==fa) continue;
if (!pd) find(pur,x);
}
}
int main(){
n=read();m=read();
if (n<m){
printf("0\n");
return ;
}
if (m==){
printf("%d\n",n);
for (int i=;i<=n;i++)
printf("%d ",i);
printf("\n");
for (int i=;i<=n;i++)
printf("%d ",i);
printf("\n");
return ;
}
for (int i=;i<n;i++){
int x=read(),y=read();
add(x,y);
}
dfs(,);
pd=;
int cnt=,th;
for (int i=;i<=n;i++)
if (!belong[i]) cnt++,th=;
if (cnt>=m){
sz++;
cap[sz]=th;
for (int i=;i<=n;i++)
if (!belong[i]) belong[i]=sz;
}
for (int i=;i<=n;i++)
if (!belong[i]){
if (!pd) find(i,);
if (pd) belong[i]=pd;
}
printf("%d\n",sz);
for (int i=;i<=n;i++)
printf("%d ",belong[i]);
printf("\n");
for (int i=;i<=sz;i++)
printf("%d ",cap[i]);
printf("\n");
}
BZOJ 1086 王室联邦的更多相关文章
- BZOJ 1086 王室联邦 | BFS
BZOJ 1086 王室联邦 题意 把一棵树分块,每块大小在[B, 3B]之间(B由输入数据给出),每个块需要对应一个核心点,核心点可以在块内,这个点要满足块内每个点到核心点的路径上的点都属于这个块( ...
- bzoj 1086 王室联邦 —— 思路题
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1086 一眼看去很是不会,于是看看TJ... https://blog.csdn.net/ly ...
- HYSBZ 1086 王室联邦 (树的分块)
题意:国王想把他的国家划分成若干个省.他的国家有n个城市,是一棵树,即n-1条边,编号为1..n.为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市.每个省必须有 ...
- 【BZOJ】【1086】 【SCOI2005】王室联邦
树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...
- BZOJ 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1399 Solved: ...
- 【块状树】BZOJ 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 826 Solved: ...
- Bzoj 1086: [SCOI2005]王室联邦(分块)
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 9 ...
- [BZOJ 1086] [SCOI2005] 王室联邦 【树分块】
题目链接:BZOJ - 1086 题目分析 这道题要求给树分块,使得每一块的大小在 [B, 3B] 之间,并且可以通过一个块外的节点(块根)使得整个块联通. 那么我们使用一种 DFS,维护一个栈,DF ...
- bzoj 1086: [SCOI2005]王室联邦 (分块+dfs)
Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不 ...
随机推荐
- MultipartEntityBuilder.addTextBody 中文乱码
// 使用addPart+ StringBody代替addTextBody,解决中文乱码 // builder.addTextBody(entry.getKey(), entry.getValue() ...
- MFC 消息的分类
来源:孙鑫 c++ 第6集
- (转载) C/C++编译和链接过程详解 (重定向表,导出符号表,未解决符号表)
转载http://blog.csdn.net/neo_ustc/article/details/9024839 有 些人写C/C++(以下假定为C++)程序,对unresolved external ...
- [转载]用可变参数宏(variadic macros)传递可变参数表
注意:_VA_ARGS__ 从VS2005才开始支持 在 GNU C 中,宏可以接受可变数目的参数,就象函数一样,例如: #define pr_debug(fmt,arg...) printk(KER ...
- JSP错题纠错
A:判断学员是否手动安装过Tomcat(练习熟练度) B:使学员了解Tomcat的运行过程 ,浏览器向Web服务器发送请求,Web站点处理请求后,把处理后的结果响应给浏览器 C:Tomcat作为Web ...
- (转)25个增强iOS应用程序性能的提示和技巧--高级篇
高级当且仅当下面这些技巧能够解决问题的时候,才使用它们: 22.加速启动时间23.使用Autorelease Pool24.缓存图片 — 或者不缓存25.尽量避免Date格式化 高级性能提升 寻找一些 ...
- Android学习总结——欢迎页和导航页的实现
activity_welcome.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...
- 飘逸的python - 解决一个有限制的组合需求
假设有一个团队技能的需求. 这类技能是要集齐所有指定的人就能激活. 但是因为同一个人又2种身份存在,比如杨戬/神杨戬,于是便产生了组合. 这种组合跟普通组合不一样,普通组合可以随意组合.而这种组合是每 ...
- 谈谈UIView的几个layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout...
最近在学习swift做动画,用到constraint的动画,用到layoutIfNeeded就去研究了下UIView的这几个布局的方法. 下面是做得一个动画,下载地址:https://github.c ...
- Android应用程序注冊广播接收器(registerReceiver)的过程分析
前面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/公布机制,因此,使用这样的消息驱动模型的第一步便是订阅消息:而对Android应用程序来说,订阅消息事实上就是注冊广播接收器, ...