bzoj1086-王室联邦
题目
给出一棵树,求一种分块方案,使得每个块的大小\(size\in [B,3B]\)。每个块还要选一个省会,省会可以在块外,但是省会到块内任何一个点路径上的所有除了省会的点都必须属于这个块。\(n\le 1000\)。
分析
一次dfs即可解决。做法如下:
- 任意选取一个点开始dfs
- 对一个点,搜索它的所有儿子
- 如果搜索完一个儿子后发现栈中元素大于\(B\)个,那么把栈中的元素分成一个块
- 否则继续搜索
- 一个点dfs结束时把它本身入栈
实现中有一个问题,对于一个儿子,它在栈中积累了不到\(B\)个点,而在下一个搜索的儿子的下层达到了\(B\)个点,那么这样两个块就会不连通,出现问题。所以我们每次设置一个bottom,意为对于这个儿子它的栈底是哪里,这样就可以保证不会弹出之前的节点,从而保证连通性。每次弹栈的时候把当前搜索的节点设为省会,就一定能够符合要求。最后搜索完之后栈中会剩下一些节点,而这些节点必定与最后一个块连通,而最后一个块的节点个数和剩下的节点个数和\(sum\in (2B,3B]\),所以可以归进同一个块内。代码实现非常简单。
这道题是树分块方法的模版题,树分块在很多树上询问问题中都有应用。
代码
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
int read() {
int x=0,f=1;
char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=1e3+1;
int n,b,gs=0;
int sta[maxn],top=0;
int id[maxn],cap[maxn];
struct edge {
int v,nxt;
} e[maxn<<1];
int h[maxn],tot=0;
void add(int u,int v) {
e[++tot]=(edge){v,h[u]};
h[u]=tot;
}
void dfs(int x,int fa,int bot) {
for (int i=h[x],v=e[i].v;i;i=e[i].nxt,v=e[i].v) if (v!=fa) {
dfs(v,x,top);
if (top-bot>=b) {
++gs;
cap[gs]=x;
while (top!=bot) id[sta[top--]]=gs;
}
}
sta[++top]=x;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
n=read(),b=read();
for (int i=1;i<n;++i) {
int u=read(),v=read();
add(u,v),add(v,u);
}
dfs(1,0,top);
while (top) id[sta[top--]]=gs;
printf("%d\n",gs);
for (int i=1;i<=n;++i) printf("%d ",id[i]);
puts("");
for (int i=1;i<=gs;++i) printf("%d ",cap[i]);
puts("");
return 0;
}
bzoj1086-王室联邦的更多相关文章
- BZOJ1086 王室联邦 —— 树分块
题目链接:https://vjudge.net/problem/HYSBZ-1086 1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 16 ...
- Count on a tree II SPOJ - COT2 && bzoj1086 王室联邦 && bzoj2589
https://cn.vjudge.net/problem/SPOJ-COT2 这个是树上莫队模版啊.. 树上莫队有两种,第一种就是括号序莫队 设节点i在括号序中首次出现位置为pl[i] 那么路径(i ...
- BZOJ1086:[SCOI2005]王室联邦——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题面源于洛谷. 题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每 ...
- bzoj1086 [SCOI2005]王室联邦 树分块
[bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...
- 【BZOJ-1086】王室联邦 分块 + 块状树
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1094 Solved: ...
- BZOJ1086 [SCOI2005]王室联邦
Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个 ...
- BZOJ1086: [SCOI2005]王室联邦(贪心,分块?)
Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 2610 Solved: 1584[Submit][Status] ...
- BZOJ1086 [SCOI2005]王室联邦 【dfs + 贪心】
题目 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两 ...
- 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: ...
随机推荐
- tutorials
https://github.com/HadrienG/tutorials https://github.com/galaxyproject/training-material/blob/master ...
- 北京Uber优步司机奖励政策(3月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Netty示例
一,服务端 ** * 测试Netty类库:服务端代码 * Created by LiuHuiChao on 2016/10/24. */ public class NettyServerTest { ...
- crontab执行PHP
在stackoverflow上看到一个问题:http://stackoverflow.com/questions/14015543/crontab-php-wget-or-curl 有三种通过cron ...
- 虚拟机安装win7 64位-完美解决-费元星
安装虚拟机是为了安装一个oracle ,在本机安装 ,本机会卡死,不是每次启动电脑都用oralce,而且有时候服务是关不干净的,所以安装在虚拟机里,需要的时候在开启,特做此记录! 费元星版权Q[971 ...
- hdu1050Moving Tables(贪心)
Moving Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- Error -26377: No match found for the requested parameter
Error -26377: No match found for the requested parameter
- MySQL☞upper函数
upper(列名/字符串):把小写字母改为大写字母 格式: select upper(列名/字符串) from 表名 如下图:
- 统计hive库表在具体下所有分区大小
1 查询具体表分区大小,以字节展示 hadoop fs -du /user/hive/warehouse/treasury.db/dm_user_excercise > dm_user_exce ...
- 【WXS全局对象】Global
Global对象的方法调用时,无需使用 Global.parseInt(...),而是直接使用 parseInt(...) 方法: 名称 说明 parseInt(string, radix) 解析一个 ...