BZOJ 1086: [SCOI2005]王室联邦 [树上分块]
题意:
树分成若干块大小在$[s,3s]$之间,每块有一个根(可以不在块内),所有点到根路径上的点都必须在块内
据说这是一个保证了块大小直径个数的科学分块方法,貌似只有本题有用 我错了原来是树上莫队可以用啊....
做法是,dfs并维护一个栈,dfs到某一个点考虑从子树中找以它为根的块,当遍历某一棵子树结束时栈中元素$\ge s$就分成一块
可以保证块的大小$\le 2s$,因为假如这个子树结束后为$s-1$,而下一个子树最多再贡献$s$个点
处理完当前点再把当前点入栈
dfs结束后还有一些点没有块,这些点一定$<s$,直接分入最后一块就行了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N=;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,s;
struct edge{int v,ne;}e[N<<];
int cnt,h[N];
inline void ins(int u,int v){
e[++cnt]=(edge){v,h[u]}; h[u]=cnt;
e[++cnt]=(edge){u,h[v]}; h[v]=cnt;
}
int st[N],top, pos[N],m,root[N];
void dfs(int u,int fa){
int bot=top;
for(int i=h[u];i;i=e[i].ne) if(e[i].v!=fa) {
dfs(e[i].v, u);
if(top-bot>=s){
root[++m]=u;
while(top!=bot) pos[st[top--]]=m;
}
}
st[++top]=u;
}
int main(){
freopen("in","r",stdin);
n=read();s=read();
for(int i=;i<n;i++) ins(read(), read());
dfs(,);
while(top) pos[st[top--]]=m;
printf("%d\n",m);
for(int i=;i<=n;i++) printf("%d%c",pos[i], i==n?'\n':' ');
for(int i=;i<=m;i++) printf("%d%c",root[i],i==m?'\n':' ');
return ;
}
BZOJ 1086: [SCOI2005]王室联邦 [树上分块]的更多相关文章
- Bzoj 1086: [SCOI2005]王室联邦(分块)
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 1557 Solved: 9 ...
- 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: ...
- [BZOJ 1086] [SCOI2005] 王室联邦 【树分块】
题目链接:BZOJ - 1086 题目分析 这道题要求给树分块,使得每一块的大小在 [B, 3B] 之间,并且可以通过一个块外的节点(块根)使得整个块联通. 那么我们使用一种 DFS,维护一个栈,DF ...
- bzoj 1086: [SCOI2005]王室联邦 (分块+dfs)
Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不 ...
- bzoj 1086 [SCOI2005]王室联邦——思路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1086 于是去看了题解. 要回溯的时候再把自己加进栈里判断.这样才能保证剩下的可以通过自己连到 ...
- BZOJ 1086 [SCOI2005]王室联邦 ——DFS
手把手教你树分块系列. 只需要记录一个栈,如果等于B的情况就弹栈,令省会为当前节点. 然后把待分块的序列不断上传即可. 考虑到有可能弹出不是自身节点的子树节点,所以记录一下当前的栈底. DFS即可 # ...
- 1086: [SCOI2005]王室联邦
1086: [SCOI2005]王室联邦 Time Limit: 10 Sec Memory Limit: 162 MBSec Special JudgeSubmit: 1554 Solved: ...
- bzoj1086 [SCOI2005]王室联邦 树分块
[bzoj1086][SCOI2005]王室联邦 2014年11月14日2,6590 Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的 ...
随机推荐
- Max Sum(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- 在64位系统下,指向int型的指针占的内存空间多大?
不废话,请看代码演示如下: 注意使用的操作系统的位数,不同位数的操作系统,结果不一样! 我是用的是64位的操作系统! linux下示例代码如下: #include <stdio.h> in ...
- Oracle复制表结构及数据
1. 复制表结构及其数据: create table table_name_new as select * from table_name_old 2. 只复制表结构: ; 或者: create ...
- 01-01_环境准备_pyenv
本文重点: 了解pyenv pyenv下载及安装 pyenv 使用 安装ipython 一.了解pyenv 经常遇到这样的情况: 系统自带的 Python 是 2.6,自己需要 Python 2.7 ...
- java实现单链表常见操作
一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...
- windows下更改mysql数据储存物理目录
windows10 1.停止mysql服务 以管理员身份运行cmd 输入命令 net stop mysql57 (我的mysql版本是5.7的,具体名称以你当前版本为主) 也可以打开任务管理器找到上面 ...
- Unity Instantiate各函数执行顺序
GameObject go = Instantiate(aaa) ; go.GetComponent<NewBehaviourScript>().Init(); Instan ...
- input事件中文触发多次问题研究
我们在网页中经常会遇到实时搜索的情况,或者其他类似需要input实时响应的问题,一般情况下,我们是利用input和propertychange事件来监听input内容的变化来响应,但是有一个问题就是当 ...
- VisualSFM+PMVS生成稠密点云
利用相机拍摄一个场景不同角度的图片,使用VisualSFM能够得到稀疏点云,如果想要得到稠密点云,可以在VisualSFM中加入PMVS的应用程序,PMVS会作为一个插件运行将稀疏点云插成稠密的点云. ...
- mybatis_SQL映射(4)鉴别器
摘录自:http://blog.csdn.net/y172158950/article/details/17505739 鉴别器:有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的 ...