【SCOI 2005】王室联邦 树上分块?
在WZH大神(PS:我是渣渣WZH)的博客看见的一个分块题目,刚好要复习分块,于是我就研究了一下树上分块,恩,这个题目的要求和树上分块差不多。没什么就是原来的SIZE变成题目规定的B了,然后这就变成了分块的模板题目。
BZOJ
大神WZH的博客ORZWZH
Description
“余”人国的国王想重新编制他的国家。他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成
员来管理。他的国家有n个城市,编号为1..n。一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条
直接或间接的道路。为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个
城市。每个省必须有一个省会,这个省会可以位于省内,也可以在该省外。但是该省的任意一个城市到达省会所经
过的道路上的城市(除了最后一个城市,即该省省会)都必须属于该省。一个城市可以作为多个省的省会。聪明的
你快帮帮这个国王吧!
Input
第一行包含两个数N,B(1<=N<=1000, 1 <= B <= N)。接下来N-1行,每行描述一条边,包含两个数,即这
条边连接的两个城市的编号。
Output
如果无法满足国王的要求,输出0。否则输出数K,表示你给出的划分方案中省的个数,编号为1..K。第二行输
出N个数,第I个数表示编号为I的城市属于的省的编号,第三行输出K个数,表示这K个省的省会的城市编号,如果
有多种方案,你可以输出任意一种。
Sample Input
8 2 1 2 2 3 1 8 8 7 8 6 4 6 6 5
Sample Output
32 1 1 3 3 3 3 2 2 1 8
题解:
构造树上分块的原理是深搜,我们搜索每一个子树如果我们子树的大小已经大于B,那么我们就把到我现在这个点为止的所有加入当前块中,然后把我这个点设置为省会。
若到根节点的大小都小于B,那么我就把根节点加入最近的分块,最近的分块一定和根节点没有加入分块联通。因为我们前面的每个分块大小一定大于B,小于2B,所以加上我们这个点附近的点之后我们这个分块一共只有不大于3B个点。
哦,还要说一下为了防止不同的子树(不通过省会连通)放在同一个分块中那么,我们要记录一下我的当前点在栈的位置。最多只能将这个点以前的点加入分块。
代码:
#include <iostream>
#include <cstdio>const int MAXN = 10050;using namespace std;int N,B,e = 1,top,sz;
int head[MAXN],s[MAXN],BL[MAXN],RT[MAXN];struct node{int v,next;
}edge[MAXN];inline int read()
{int x = 0;char ch = getchar();while(ch < '0' || '9' < ch){ch = getchar();}while('0' <= ch&&ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x;
}inline void addedge(int u,int v){edge[e] = (node){v,head[u]};head[u] = e++;
}inline void init()
{N = read();B = read();int u,v;for(int i = 1;i < N;i++){u = read();v = read();addedge(u,v);addedge(v,u);}}void dfs(int u,int fa){int tmp = top; //tmp 是当前栈的位置 for(int i = head[u];i;i = edge[i].next){int v = edge[i].v;if(v != fa){dfs(v,u);if(top - tmp >= B){RT[++sz] = u;while(top != tmp) BL[s[top--]] = sz;} }}s[++top] = u;
}int main()
{init();dfs(1,0);while(top) BL[s[top--]] = sz;printf("%d\n",sz);for(int i = 1;i <= N;i++) printf("%d ",BL[i]);printf("\n");for(int i = 1;i <= sz;i++) printf("%d ",RT[i]);return 0;
}
【SCOI 2005】王室联邦 树上分块?相关推荐
- 【BZOJ1086】[SCOI2005]王室联邦 树分块
[BZOJ1086][SCOI2005]王室联邦 Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. ...
- bzoj1086[SCOI2005]王室联邦
传送门 Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些 ...
- 1086: [SCOI2005]王室联邦
(大概 打了5天比赛 学习计划 树上莫队一直都没来得及学 今天做了第一道树上分块的题 写挂了5,6次 许多细节没有注意到 慢慢改才发现 orz 继续加油 1086: [SCOI2005]王室 ...
- [SCOI2005]王室联邦
[SCOI2005]王室联邦 类似树分块 >=B,并且<=3B 直接dfs,用一个全局栈记录未规定省份的元素 dfs(y)上来,如果栈内元素>=B,就弹出来变成一个省,并且省会是x( ...
- bzoj 1086: [SCOI2005]王室联邦
Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有 ...
- BZOJ1086 [SCOI2005]王室联邦 【dfs + 贪心】
题目 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两 ...
- 【BZOJ】【1086】 【SCOI2005】王室联邦
树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...
- bzoj 1086: [SCOI2005]王室联邦(DFS)
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2100 Solved ...
- BZOJ1086:[SCOI2005]王室联邦——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题面源于洛谷. 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国 ...
- BZOJ 1086: [SCOI2005]王室联邦( )
其实合法方案一定存在....(B <= N), 构造答案就可以了...然而我是看题解才会的..... ---------------------------------------------- ...
最新文章
- .net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1
- 关于javascript闭包中的this对象
- 2022年第一波AI重磅监管:官方发布“算法推荐管理规定”
- 每一個故事兜發生在狠乆以前
- unity粒子系统_【笔记】关于unity的粒子系统和UI之间的位置冲突解决
- docker删除本地所有镜像
- Java中的责任链模式
- red hat linux综合实验报告,实验一 Red Hat Linux 9.doc
- 性能测试工具_K6性能测试工具的使用入门
- x264源代码简单分析:x264_slice_write()
- 注册表的保存位置在哪里?注册表文件保存在哪里?
- 长链接转化成短链接java,长链接转短链接(短网址)
- 实践论:论认识和实践的关系
- 基于TI AM335X的工业网关参考设计分享
- 京东618自动浏览叠蛋糕app
- PDF转Word免费的软件有哪些?教给你三种转换方法
- 怎么解决运行时输入错误,请重新输入以及专业无法输入的问题
- 面向对象和面向过程的区别通俗理解
- FFmpeg系列(四)—— mp4音视频流分离
- 关于ERP系统提前期运算逻辑的三点介绍
热门文章
- 5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇
- php 生成单色位图,使用PHP实现将jpg/png转成.wbmp/.bmp格式图片后再转为16进制字符串(单色位图取模)...
- 服务器主控芯片,物联网主控芯片6大架构分析 谁能独当一面
- 使用 Suspense 改善 Vue 3 中的用户体验
- 应用于高速计数器的编码器基础知识介绍
- mysql group by 用法解析
- Matlab 常用语句(5)---eig(求特征值和特征向量)
- qq 客服 php,QQ支持临时会话设置
- 相差天数时分秒_PHP 小方法之 计算两个时间戳之间相差的日时分秒
- 计算机能玩什么游戏,《梦幻西游网页版》官网——网易官方正版出品