题解 [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] << ' ';
}
题解 [SCOI2005]王室联邦的更多相关文章
- 【块状树】BZOJ 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 826 Solved: ...
- bzoj1086 [SCOI2005]王室联邦 树分块
[bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...
- 洛谷P2325 [SCOI2005]王室联邦
P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有n个城市, ...
- BZOJ 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1399 Solved: ...
- 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1554 Solved: ...
- P2325 [SCOI2005]王室联邦 解题报告
P2325 [SCOI2005]王室联邦 题目描述 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理. 他的国家有\(n\) ...
- Bzoj 1086: [SCOI2005]王室联邦(分块)
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 9 ...
- BZOJ1086:[SCOI2005]王室联邦——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1086 题面源于洛谷. 题目描述 “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每 ...
- BZOJ1086 [SCOI2005]王室联邦 【dfs + 贪心】
题目 "余"人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两 ...
- BZOJ1086 [SCOI2005]王室联邦
Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成 员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个 ...
随机推荐
- js 金钱3位格式化
function formatCash(str) { return str.split('').reverse().reduce((prev, next, index) => { return ...
- ajax 获取json值
请求后台获取json: {"success":true,"datamap":{"rebackName":"振勋"}} a ...
- ArcGIS API for JS 访问浏览器提示不安全链接的服务时 如何设置
当我们通过ArcGISServer发布了服务后,首先要在要访问的计算机上通过浏览器访问下服务是否可用.但有时候会出现不安全的标识. 如果这样的链接直接放到代码中,可能会加载失败. 代码如下. var ...
- nginx-1.22.0版本安装
nginx运行状态查看 查看80端口占用情况:netstat -tunlp | grep 80 # 查看进程是否运行ps -A | grep nginx # 强制关闭nginxpkill nginx ...
- 【小项目】微信定时推送天气预报Github项目使用及原理介绍-包含cron、天气预报、常用api
一.资料链接 1.github地址 https://github.com/qq1534774766/wx-push 2.教程地址 https://blog.csdn.net/qq15347747/ar ...
- 4.5:HDFS操作实验
〇.概述 1.拓扑结构 2.目标 进行HDFS的实验,了解HDFS的基本操作. 一.常用操作 1.启动 50070 2.查看及创建 3.上传文件
- Hexo博客搭建和简单部署
title: Hexo博客搭建和简单部署 date: 2020-03-02 12:00:00 categories: - [IT,博客] - [IT,软件,程序] - [IT,软件,搭建与配置] ta ...
- socet网络编程
一. 网络模型 应用层 ----- HTTP协议 传输层 ----- TCP协议 网络层 ----- IP协议 链路层 ----- 以太网协议 二. ...
- jmeter 之 JSON 断言
1.JSON 断言所在位置:断言->JSON 断言 2.JSON断言中的字段解析 Assert JSON Path exists:json 表达式,判断所字段是否存在,存在则为True, 否则为 ...
- [编程基础] C++多线程入门2-连接和分离线程
原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 2 连接和 ...