首页 > 其他分享 >「清新题精讲」Gym100198H - Royal Federation

「清新题精讲」Gym100198H - Royal Federation

时间:2024-07-08 17:52:22浏览次数:9  
标签:tmp sz par int 精讲 Royal pb find Gym100198H

H - Royal Federation

\(\mathsf{\color{Thistle}Statement}\)

给定一棵 \(n\) 个点的树,将其划分为 \(m\) 个集合(\(m\) 可以为任意正整数),对于每个集合,顷定其特殊点,使得该点可以到达属于该集合内的所有点只经过集合内的点(注意特殊点可以不在集合内),其中集合大小要求在 \(B\sim 3B\) 之间。

\(\mathsf{\color{Thistle}Solution}\)

通过 DFS 由底向上合并,对于点 \(u\),考虑 \(u\) 的所 \(u\) 的儿子 \(v_i\),对于 \(\forall i,j\) 使得 \(v_i< B,v_j<B\),合并 \(i,j\)。若合并后还是 \(<B\),则在与其余儿子合并。

如果按照上述合并方式,最终剩余 \(1\) 个儿子 \(<B\),但无法合并,则将该儿子与 \(u\) 合并(目的是当统计 \(u\) 的父亲的时候,使得该儿子所在集合可以进一步合并)

注意:当处理完整棵树之后,有可能 \(1\) 点所在的集合 \(<B\),如若真如此,则将 \(1\) 点所在集合与下面的相邻的集合合并即可,可以证明合并完之后仍在 \(B\sim 3B\) 之间。

Proof 注意到与 1 点相邻的集合是由两个小于 B 的集合合并而成,故必然 < 2B。而当前 1 点所在的集合大小 < B,所以合并后 < 3B。

合并使用并查集即可,特殊点(原题为省会)的维护也是简单的(具体见代码吧)。时间复杂度 \(O(n\alpha(n))\)。

\(\mathsf{\color{Thistle}Code}\)

#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 1e4 + 10;

int n, m, B;
int par[N], sz[N], ctr[N], id[N];
std::vector<int> g[N];

int find(int x) {
	if (par[x] != x) par[x] = find(par[x]);
	return par[x];
}
void dfs1(int u, int fa) {
	vector<PII> tmp;
	for (auto v : g[u]) {
		if (v == fa) continue;
		dfs1(v, u);
		if (sz[find(v)] < B) tmp.push_back({sz[find(v)], v});
	}
	while (tmp.size() > 1) {
		auto a = tmp.back(), b = tmp[tmp.size() - 2];
		tmp.pop_back(), tmp.pop_back();
		int pa = find(a.se), pb = find(b.se);
		par[pa] = pb, sz[pb] += sz[pa];
		if (sz[pb] < B) tmp.push_back({sz[pb], b.se});
		else ctr[pb] = u;
	}
	if (tmp.size()) {
		int pa = find(u), pb = find(tmp[0].se);
		par[pa] = pb, sz[pb] += sz[pa];
		if (sz[pb] >= B) ctr[pb] = u;
	}
}
bool ok = 0;
void dfs2(int u, int fa) {
	if (ok) return;
	for (auto v : g[u]) {
		if (v == fa) continue;
		if (find(v) != find(u)) {
			par[find(v)] = find(u), ok = 1;
			return;
		}
		else dfs2(v, u);
		if (ok) return;
	}
}

signed main() {
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	freopen("royal.in", "r", stdin);
	freopen("royal.out", "w", stdout);

	cin >> n >> B;
	for (int i = 1; i < n; i ++) {
		int u, v;
		cin >> u >> v, g[u].push_back(v), g[v].push_back(u);
	}
	for (int i = 1; i <= n; i ++ ) par[i] = i, sz[i] = 1;

	if (n <= 3 * B) {
		cout << 1 << endl;
		for (int i = 1; i <= n; i ++) cout << 1 << " ";
		cout << 1 << endl;
		return 0;
	}
	dfs1(1, -1);
	if (sz[find(1)] < B) dfs2(1, -1);

	for (int i = 1; i <= n; i ++)
		if (find(i) == i)
			id[find(i)] = ++ m;
	cout << m << endl;
	for (int i = 1; i <= n; i ++)
		cout << id[find(i)] << " ";
	cout << endl;
	for (int i = 1; i <= n; i ++)
		if (find(i) == i) {
			if (!ctr[i]) cout << i << " ";
			else cout << ctr[i] << " ";
		}

	return 0;
}

标签:tmp,sz,par,int,精讲,Royal,pb,find,Gym100198H
From: https://www.cnblogs.com/Tiny-konnyaku/p/18290471

相关文章

  • MATLAB算法实战应用案例精讲-【数模应用】偏最小二乘回归分析(PLS)(附MATLAB和python代码
    目录前言知识储备回归的方法回归的检验算法原理数学模型偏最小二乘回归建模原理:PLS的准则函数偏最小二乘基本算法​编辑 ​编辑PLS回归模型算法思想PLS回归与MLS、PCR、MRA比较SPSSAU案例应用其他说明SPSS示例(PLS命令) 变量列表(PLS命令) MODEL......
  • 芝奇Trident Z5 Royal DDR5-7200 C36 48GB内存上手:性能猛如虎
    DDR5已经上市很久了,消费者对DDR5内存的要求也越来越高。不仅对内存的频率要求高,对颜值的期待也不小。最近芝奇在今年的台北电脑展发布了全新一代的RGB内存,在颜值上再次走在了所有内存厂商的前面。同时,首发规格最高达8400MT/s,兼具时尚外观与极致性能。今天,我们有幸上手了芝奇的最......
  • 「清新题精讲」UVA 1048 - Low Cost Air Travel
    UVA1048-LowCostAirTravel\(\mathsf{\color{Thistle}{Statement}}\)给定\(n\)张机票和\(q\)次旅行,每张机票都给出飞机所经过的城市,每一次乘座飞机,必须从飞机的起始站开始,且中途不能乘坐其他飞机再回来乘坐该架飞机,但是可以提前离开飞机。对于第\(i\)次旅行,输出一次......
  • 【万字精讲】软件工程与项目管理知识点速通(简答,综合题向)
    软件工程与项目管理知识点速通(简答,综合题向)时间记录:24.61.为什么瀑布模型,原型模型,螺旋模型支持迭代开发?回答该问题,首先需要知道他们分别是什么(1)瀑布模型(WaterfallModel)瀑布模型传统上被认为是线性、顺序的开发模型,即各个阶段(需求、设计、实现、测试、部署、维护)按顺序......
  • MATLAB算法实战应用案例精讲-【数模应用】事后多重比较(附python、MATLAB和R语言代码实
    目录几个高频面试题目事后检验,多重比较,简单效应分析有什么区别?事后多重对比如何使用?算法原理SPSSAU疑难解惑提示‘数据质量异常’如何解决?如何做Dunnett法事后多重比较?方差分析事后多重比较提供‘字母标记法!’?关于方差分析时的效应量?字母标记法时没有输出结果?......
  • MATLAB基础应用精讲-【数模应用】二元Logit分析
    目录算法原理数学模型极大似然法Newton牛顿迭代法logit回归分析步骤一、二元logit分析1.基本说明2.数据处理3.SPSSAU上传数据4.分析前提示5.SPSSAU分析6.其它说明二、多分类logit分析1.基本说明2.数据要求与处理3.SPSSAU上传数据4.SPSSAU分析5.其它说明三、......
  • Go变量作用域精讲及代码实战
    关注作者,复旦AI博士,分享AI领域与云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕博,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责......
  • MATLAB基础应用精讲-【数模应用】SPSSPRO数据处理
    目录SPSSSPSSRO数据标签1、作用2、输入输出描述3、案例示例4、案例数据5、案例操作6、输出结果分析7、注意事项数据编码1、作用2、输入输出描述3、案例示例4、案例数据5、案例操作6、输出结果分析7、注意事项8、模型理论异常值处理 1、作用2、输入输出......
  • 「清新题精讲」P2150 [NOI2015] 寿司晚宴
    P2150[NOI2015]寿司晚宴Statement给定\(n-1\)个数分别为\(2\simn\),从中选出交集为空的两个集合\(A,B\)(集合的并集不必须为\(\{2,\dots,n\}\),且集合可为空)使得不存在\(a\inA,b\inB\)满足\((a,b)\ne1\)(即任意两个数均互质),将方案数对\(p\)取模后输出。\(2\len\le......
  • 车载电子电器架构 —— 智能座舱技术范围(万字长文精讲)
    车载电子电器架构——智能座舱技术范围我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利......