【BZOJ1086】【SCOI2005】王室联邦 树分块

题解:思想上是深搜+栈,每当栈中元素达到b个,就分成一个块。

然后最后会剩下部分,分到最后一个块中。

其实我认为开始的所有块都是b个啊,然后最后一个块是b+若干个,不会超过2b。

不是很理解2b~3b这个概念。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1010
using namespace std;
struct KSD
{
	int v,next;
}e[N<<1];
int head[N],cnt;
inline void add(int u,int v)
{
	e[++cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
int n,m;
int id[N],root[N],group;
// 属于哪个块,块的“省会”,总共几个块
int stk[N],top;
void dfs(int x,int p)
{
	int i,v,temp=top;
	for(i=head[x];i;i=e[i].next)
	{
		v=e[i].v;
		if(v==p)continue;
		dfs(v,x);
		if(top-temp>=m) // 树分块判定
		{
			root[++group]=x;
			while(top!=temp)id[stk[top--]]=group;
		}
	}
	stk[++top]=x;
}
int main()
{
	freopen("test.in","r",stdin);
	int i,a,b;
	scanf("%d%d",&n,&m);
	for(i=1;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
	dfs(1,0);
	while(top)id[stk[top--]]=group;
	//剩下的多出来一点扔到最后一个块里来保证>=B
	printf("%d\n",group);
	for(i=1;i<=n;i++)printf("%d ",id[i]);
	puts("");
	for(i=1;i<=group;i++)printf("%d ",root[i]);
}
时间: 2024-08-10 23:30:38

【BZOJ1086】【SCOI2005】王室联邦 树分块的相关文章

BZOJ 1086 [SCOI2005]王室联邦 树分块

题意:链接 方法:树分块 解析: 为了去刷莫队上树所以来学习树分块,听说这是裸题所以跑来搞. 树分块的过程是什么? 从树根向下递归搜索,如果回溯的节点超过了我们想分成的块的大小(不妨设为a),就将这些节点作为一个块,并且回溯到的这个节点是与该块中的任意节点连通的. 这里显然可以用一个栈来处理. 并且需要注意的是,如果我们不加以限制,会出现什么结果呢?会使分的块中的元素碎成渣,即瞎分. 什么限制呢? 是对于每个节点的相对栈底的限制. 如果在当前节点,其有两个儿子. 在左儿子的子树中搜得的节点数是a

Bzoj1086 [SCOI2005]王室联邦

Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1749  Solved: 1056 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路.为了防止管理太过分散,每个省至少要有B个城市,为了能有效的管理,每个省最多只有3B个城市

BZOJ1086 SCOI2005王室联邦

想学树上莫队结果做了个树分块. 看完题后想到了菊花图的形状认为无解,结果仔细一瞧省会可以在外省尴尬 对于每一颗子树进行深搜,一旦遇到加在一起大小达到B则将它们并为一省,因为他子树搜完以后没有分出块的大小是小于B的,而且他自己当前剩下的也是小于B的,所以可以放心和. 最后剩下的点肯定也小于B所以与最后一个省一合即可.当前子树根节点留给上面也是因为这个. By:大奕哥 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=10

【BZOJ-1086】王室联邦 分块 + 块状树

1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1094  Solved: 650[Submit][Status][Discuss] Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路

【块状树】BZOJ 1086: [SCOI2005]王室联邦

1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 826  Solved: 471[Submit][Status][Discuss] Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路.

bzoj 1086: [SCOI2005]王室联邦(树上分块)

1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 1107  Solved: 662 [Submit][Status][Discuss] Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条

[bzoj 1086][SCOI2005]王室联邦

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1086 [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1876  Solved: 1144[Submit][Status][Discuss] Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国

【BZOJ 1086】 [SCOI2005]王室联邦

1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special Judge Submit: 599  Solved: 309 [Submit][Status] Description "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路.为了

1086: [SCOI2005]王室联邦

1086: [SCOI2005]王室联邦 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 1554  Solved: 933[Submit][Status][Discuss] Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不同的城市之间有且仅有一条直接或间接的道路