ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 [SCOI2005]王室联邦

2022-08-10 20:30:39  阅读:119  来源: 互联网

标签:cnt sta 王室 int 题解 top MAXN gra SCOI2005


之前树分块也只是听说,今天亲手学了一下(?)(

首先你会发现这个 \(B\) 和 \(3B\) 的约束就很迷(我也不知道为什么搞这种奇怪的约束(悲)),学了才知道。。。

所以这题的分块方法好像叫“王室联邦分块法”。

可还行~

不吹水了,来口胡一波。

首先明确一点,任何一个省会一定是一群节点的祖先。

因此我们可以考虑将一棵树的一个节点断掉然后不断递归这样是没法处理的,我们考虑王室联邦分块法可还行。DFS 整棵树,对于每个节点 \(u\),遍历所有儿子 \(v\)。我们先设有一个栈 \(sta\)。当我们在做的时候,如果新加的元素超过 \(b\) 个我们就新开一个省,把 \(u\) 作为省会,然后把栈刚刚加过的 \(b\) 个元素弹出来。最后我们还要将 \(u\) 入栈,返回上一层。

DFS 完可能剩下一些点,我们把它丢进以根为省会的省中。

这个过程是不是很简单?我们考虑这个算法的合法性。

每个点顶多会有 \(b\) 个,它的儿子的点就得减去它本身,\(b - 1\) 个,也就是说 \(sta\) 任意时刻不可能大小超过 \(2b - 1\)。

剩下的 \(sta\) 顶多 \(b\) 个,根顶多 \(2b - 1\) 个,最终顶多 \(3b - 1\) 个,合法。

其实感觉自己理解的有点不太到位啊,明天再填坑,如果有纰漏 QQ 撅我,QQ 2392303708

//SIXIANG
#include <iostream> 
#include <vector> 
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
vector <int> gra[MAXN + 10];
int sta[MAXN + 10], top = 0;
int cap[MAXN + 10], bel[MAXN + 10], cnt = 0;
int n, b;
void dfs(int u, int fa) {
	int now = top;
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p];
		if(v != fa) {
			dfs(v, u);
			if(top - now >= b) {
				cap[++cnt] = u;
				while(top != now)
					bel[sta[top--]] = cnt; 
			}
		}
	}
	sta[++top] = u;
}
int main() {
	cin >> n >> b;
	for(int p = 1, x, y; p < n; p++) {
		cin >> x >> y;
		gra[x].push_back(y);
		gra[y].push_back(x);
	}
	dfs(1, 0);
	while(top)
		bel[sta[top--]] = cnt;
	
	cout << cnt << endl;
	for(int p = 1; p <= n; p++)
		cout << bel[p] << ' ';
	cout << endl;
	for(int p = 1; p <= cnt; p++)
		cout << cap[p] << ' ';
}

标签:cnt,sta,王室,int,题解,top,MAXN,gra,SCOI2005
来源: https://www.cnblogs.com/thirty-two/p/16573790.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有