Description

  “余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市可以作为多个省的省会。聪明的你快帮帮这个国王吧!

解题报告

这题是另一种分块方法,从下往上做,回溯时入栈,当子树内的栈元素达到了B,我们就新建一个块,子数内的栈中元素加入块中,因为每一个子树块\(<B\),所以弹栈时 \(<2*B\),对于最后一个多出来的块也一定 \(<B\),如果 \(>=B\) 直接新建一个块,否则和上个块合并,由于块内元素 \(<2*B\),所以加入后 \(<3*B\)

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=1005;
int n,B,head[N],num=0,nxt[N<<1],to[N<<1],cnt=0,st[N],top=0,fa[N],bel[N];
void link(int x,int y){nxt[++num]=head[x];to[num]=y;head[x]=num;}
void dfs(int x,int last){int u,s=top;for(int i=head[x];i;i=nxt[i]){u=to[i];if(u==last)continue;dfs(u,x);if(top-s>=B){fa[++cnt]=x;while(top!=s)bel[st[top--]]=cnt;}}st[++top]=x;
}
void work()
{int x,y;scanf("%d%d",&n,&B);for(int i=1;i<n;i++){scanf("%d%d",&x,&y);link(x,y);link(y,x);}dfs(1,1);while(top)bel[st[top--]]=cnt;printf("%d\n",cnt);for(int i=1;i<=n;i++)printf("%d ",bel[i]);puts("");for(int i=1;i<=cnt;i++)printf("%d ",fa[i]);
}int main(){work();return 0;}

转载于:https://www.cnblogs.com/Yuzao/p/7654558.html

bzoj 1086: [SCOI2005]王室联邦相关推荐

  1. BZOJ 1086: [SCOI2005]王室联邦( )

    其实合法方案一定存在....(B <= N), 构造答案就可以了...然而我是看题解才会的..... ---------------------------------------------- ...

  2. bzoj 1086: [SCOI2005]王室联邦(DFS)

    1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 2100  Solved ...

  3. BZOJ 1086 [SCOI2005]王室联邦(树分块)

    题意:中文题,略 思路:秦皇岛前就一直想学,后来没怎么想通,就算了.现在雅不是很懂,一直似懂非懂的,对于树分块的种类,有位聚聚已经整理好了(传送门),其他的就是直接搜索分块 代码: #include ...

  4. 1086: [SCOI2005]王室联邦

    (大概 打了5天比赛   学习计划 树上莫队一直都没来得及学 今天做了第一道树上分块的题  写挂了5,6次  许多细节没有注意到  慢慢改才发现 orz 继续加油 1086: [SCOI2005]王室 ...

  5. [SCOI2005]王室联邦

    [SCOI2005]王室联邦 类似树分块 >=B,并且<=3B 直接dfs,用一个全局栈记录未规定省份的元素 dfs(y)上来,如果栈内元素>=B,就弹出来变成一个省,并且省会是x( ...

  6. 【BZOJ1086】[SCOI2005]王室联邦 树分块

    [BZOJ1086][SCOI2005]王室联邦 Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. ...

  7. BZOJ1086:[SCOI2005]王室联邦——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题面源于洛谷. 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国 ...

  8. BZOJ1086 [SCOI2005]王室联邦 【dfs + 贪心】

    题目 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两 ...

  9. bzoj1086[SCOI2005]王室联邦

    传送门 Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些 ...

最新文章

  1. 拼多多成立技术顾问委员会,陆奇将领导相关工作
  2. 【MaxCompute】学习笔记常用查询sql
  3. python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目
  4. java 编写方法和属性,编写一个关于教师的JAVA-BEAN,要求实现其基本属性如年龄,性别等的get和set方法...
  5. 关于Servlet的原理以及常用类
  6. python zookeeper_ZooKeeper的安装以及客户端Kazoo(Python语言)的安装与使用
  7. 正式踏入24岁了……
  8. 几十行python代码构建一个前后端分离的目标检测演示网站,代码开源
  9. 【VMware vSAN 6.6】5.4.vSAN 配置提示:vSAN硬件服务器解决方案
  10. bug篇——mysql排序混乱问题
  11. 计算机专业新手博客,【转载】学计算机必读献给计算机专业大一新生(1)
  12. MXY-单点登陆系统
  13. linux spdbv教程,计算机化学实践基础教程
  14. 聚类算法-密度聚类算法DBSCAN
  15. 项目过程管理(五)需求文档
  16. cv2库中一些函数的使用
  17. 彷徨 | HDFS核心设计思想图
  18. org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest
  19. 【EF】对象名 'dbo.EdmMetadata' 无效。
  20. python闰年统计_利用Python写一个闰年计算器和每月天数计算器

热门文章

  1. python拟合求参_机器学习作业(四)神经网络参数的拟合——Python(numpy)实现
  2. php集成paypal付款流程,在PHP中集成PayPal标准支付
  3. win10系统优化计算机,全面优化win10电脑系统详细教程 | 专业网吧维护
  4. 从qspi启动linux时间,Zynq-Linux移植学习笔记(二十三)——QSPI速度配置
  5. java反射最佳实践,java反射性能测试分析
  6. 第一代电子计算机诞生的国家是( ),计算机基础知识习题.doc
  7. oppor17android版本,OPPOR17ColorOS系统怎么样
  8. linux 文件拷贝并替换,Linux_cmd replace 文件替换使用说明,帮助信息: 复制代码 代码如 - phpStudy...
  9. 宏定义来实现一个结构体成员相对于该结构体首地址的偏移量
  10. 华为机考HJ6求质因子C语言解法