在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】王室联邦 树上分块?相关推荐

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

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

  2. bzoj1086[SCOI2005]王室联邦

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

  3. 1086: [SCOI2005]王室联邦

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

  4. [SCOI2005]王室联邦

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

  5. bzoj 1086: [SCOI2005]王室联邦

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

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

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

  7. 【BZOJ】【1086】 【SCOI2005】王室联邦

    树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...

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

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

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

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

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

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

最新文章

  1. .net里鼠标选中的text数据怎么获取_Python数据科学实践 | 爬虫1
  2. 关于javascript闭包中的this对象
  3. 2022年第一波AI重磅监管:官方发布“算法推荐管理规定”
  4. 每一個故事兜發生在狠乆以前
  5. unity粒子系统_【笔记】关于unity的粒子系统和UI之间的位置冲突解决
  6. docker删除本地所有镜像
  7. Java中的责任链模式
  8. red hat linux综合实验报告,实验一 Red Hat Linux 9.doc
  9. 性能测试工具_K6性能测试工具的使用入门
  10. x264源代码简单分析:x264_slice_write()
  11. 注册表的保存位置在哪里?注册表文件保存在哪里?
  12. 长链接转化成短链接java,长链接转短链接(短网址)
  13. 实践论:论认识和实践的关系
  14. 基于TI AM335X的工业网关参考设计分享
  15. 京东618自动浏览叠蛋糕app
  16. PDF转Word免费的软件有哪些?教给你三种转换方法
  17. 怎么解决运行时输入错误,请重新输入以及专业无法输入的问题
  18. 面向对象和面向过程的区别通俗理解
  19. FFmpeg系列(四)—— mp4音视频流分离
  20. 关于ERP系统提前期运算逻辑的三点介绍

热门文章

  1. 5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇
  2. php 生成单色位图,使用PHP实现将jpg/png转成.wbmp/.bmp格式图片后再转为16进制字符串(单色位图取模)...
  3. 服务器主控芯片,物联网主控芯片6大架构分析 谁能独当一面
  4. 使用 Suspense 改善 Vue 3 中的用户体验
  5. 应用于高速计数器的编码器基础知识介绍
  6. mysql group by 用法解析
  7. Matlab 常用语句(5)---eig(求特征值和特征向量)
  8. qq 客服 php,QQ支持临时会话设置
  9. 相差天数时分秒_PHP 小方法之 计算两个时间戳之间相差的日时分秒
  10. 计算机能玩什么游戏,《梦幻西游网页版》官网——网易官方正版出品