Codeforces G. Ciel the Commander
题目描述:
Ciel the Commander
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, has n cities connected by n - 1 undirected roads, and for any two cities there always exists a path between them.
Fox Ciel needs to assign an officer to each city. Each officer has a rank — a letter from 'A' to 'Z'. So there will be 26 different ranks, and 'A' is the topmost, so 'Z' is the bottommost.
There are enough officers of each rank. But there is a special rule must obey: if x and y are two distinct cities and their officers have the same rank, then on the simple path between x and y there must be a city z that has an officer with higher rank. The rule guarantee that a communications between same rank officers will be monitored by higher rank officer.
Help Ciel to make a valid plan, and if it's impossible, output "Impossible!".
Input
The first line contains an integer n (2 ≤ n ≤ 105) — the number of cities in Tree Land.
Each of the following n - 1 lines contains two integers a and b (1 ≤ a, b ≤ n, a ≠ b) — they mean that there will be an undirected road between a and b. Consider all the cities are numbered from 1 to n.
It guaranteed that the given graph will be a tree.
Output
If there is a valid plane, output n space-separated characters in a line — i-th character is the rank of officer in the city with number i.
Otherwise output "Impossible!".
Examples
Input
Copy
4
1 2
1 3
1 4
Output
Copy
A B B B
Input
Copy
10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
Output
Copy
D C B A D C B D C D
Note
In the first example, for any two officers of rank 'B', an officer with rank 'A' will be on the path between them. So it is a valid solution.
思路:
题目是给一个树,在树上的节点标号,要求是两个相同标号的连通的路径上必须有一个比他们等级高的标号。
刚开始时,这样想的:画了一幅图(很简单的),我把度数为一的标号为'Z',删掉这些点,又出现了度数唯一的点,标为'Y',再删掉,这样每次标记度数为一的点然后删到最后只剩两个点再特殊处理一下,如果这个过程中出现了字母用完的情况就说明不可能。但是这样做有个问题,其实字母用完了还是有可能继续完成标号的,我又改为字母用完了有倒序从'B'到'Z'标号,这样倒过来倒过去,还是错了,_(:з」∠)__
真正的做法是每次找树的重心,在重心处标号,根据重心定义(当前所有节点中最大的子树最小的节点),重心的最大子树的大小不会超过重心所在子树的一半。如果树退化成一条链,可以标记的节点数为\(1+2+4+...+2^{25}=2^{26}\)个节点,远远多于题目的限制。如果树不退化成链,那么可标记的点更多。因此必有解。
注意的是divide函数里面下一次divide是\(rt\)而不是\(v\)啊,血的教训啊w(゚Д゚)w,不是找的重心当然会把标记用光。
代码:
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f3f
#define max_n 200005
using namespace std;
int n;//n为节点数
char ans[max_n];
//链式前向星
int cnt = 0;
int head[max_n];
struct edge
{
int v;
int nxt;
}e[max_n<<1];
void add(int u,int v)
{
++cnt;
e[cnt].v=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int rt,ms;//rt为重心,ms是最小 最大子树的大小
int Size;//当前整棵树的大小
int sz[max_n];//sz[i]表示以i为根的子树大小
int mson[max_n];//mson[i]表示以i的最大子树的大小
bool visit[max_n];//标记是否分治过
//求重心函数
void get_root(int u,int from)
{
sz[u]=1;mson[u]=0;//开始时以u为根的子树大小为1,u的最大子树为0
for(int i=head[u];i;i=e[i].nxt)//遍历与u相连边
{
int v=e[i].v;
if(visit[v]||v==from) continue;//防止重复遍历
get_root(v,u);
sz[u]+=sz[v];//更新以u为根的子树大小
mson[u]=max(mson[u],sz[v]);//更新u的最大子树
}
if(Size-sz[u]>mson[u]) mson[u]=Size-sz[u];//看是否另一半子树更大
if(ms>mson[u]) ms=mson[u],rt=u;//更新最小的最大子树和重心
}
//求解答案函数
//分函数
void divide(int u,int ssize,int ch)
{
visit[u]=true;//当前节点已分治
ans[u] = ch;
for(int i = head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(visit[v]) continue;//已分治过的不用再分治
ms=INF;rt=0;//每一次求重心都要初始化这两个值
Size=sz[v]<sz[u]?sz[v]:ssize-sz[u];
get_root(v,0);//求出子树的重心
divide(rt,Size,ch+1);//分治子树
}
}
int main()
{
cin >> n;
for(int i = 1;i<n;i++)
{
int u,v;
cin >> u >> v;
add(u,v);
add(v,u);
}
Size=n;//开始为n整棵树大小
rt=0;ms=INF;
get_root(1,0);
/*for(int i = 1;i<=n;i++)
{
cout << "sz " << sz[i] << " mson " << mson[i] << endl;
}
cout << "rt " << rt << endl;*/
divide(rt,n,0);
for(int i = 1;i<=n;i++)
{
char chr = ans[i]+'A';
cout << chr << " ";
}
cout << endl;
return 0;
}
参考文章:
九野的博客,Codeforces 321C Ciel the Commander 树分治,https://blog.csdn.net/acmmmm/article/details/46931215
Codeforces G. Ciel the Commander的更多相关文章
- CodeForces 321C Ciel the Commander
Ciel the Commander Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...
- Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
E. Ciel the Commander Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contest ...
- CF 322E - Ciel the Commander 树的点分治
树链剖分可以看成是树的边分治,什么是点分治呢? CF322E - Ciel the Commander 题目:给出一棵树,对于每个节点有一个等级(A-Z,A最高),如果两个不同的节点有相同等级的父节点 ...
- Codeforce 322E Ciel the Commander (点分治)
E. Ciel the Commander Now Fox Ciel becomes a commander of Tree Land. Tree Land, like its name said, ...
- Ciel the Commander CodeForces - 321C (树, 思维)
链接 大意: 给定n结点树, 求构造一种染色方案, 使得每个点颜色在[A,Z], 且端点同色的链中至少存在一点颜色大于端点 (A为最大颜色) 直接点分治即可, 因为最坏可以涂$2^{26}-1$个节点 ...
- Codeforces 321E Ciel and Gondolas
传送门:http://codeforces.com/problemset/problem/321/E [题解] 首先有一个$O(n^2k)$的dp. # include <stdio.h> ...
- codeforces B. Ciel and Flowers 解题报告
题目链接:http://codeforces.com/problemset/problem/322/B 题目意思:给定红花.绿花和蓝花的朵数,问组成四种花束(3朵红花,3朵绿花,3朵蓝花,1朵红花+1 ...
- Codeforces 321D Ciel and Flipboard(结论题+枚举)
题目链接 Ciel and Flipboard 题意 给出一个$n*n$的正方形,每个格子里有一个数,每次可以将一个大小为$x*x$的子正方形翻转 翻转的意义为该区域里的数都变成原来的相反数. ...
- CodeForces 321A Ciel and Robot(数学模拟)
题目链接:http://codeforces.com/problemset/problem/321/A 题意:在一个二维平面中,開始时在(0,0)点,目标点是(a.b),问能不能通过反复操作题目中的指 ...
随机推荐
- [转]Gnome桌面的录屏插件easyscreencast
原文地址:https://www.linuxprobe.com/gnome-easyscreencast.html
- Jmeter(一) Jmeter基本使用
1.下载安装 官方网站 https://jmeter.apache.org/download_jmeter.cgi 选择下载即可 2.基本使用 下载解压后,目录如下: 进入到bin目录, 双击jmet ...
- 使用ReadtheDocs托管技术文档
ReadtheDocs Read the Docs非常适合写软件文档以及编写一些教程.电子书之类.对于一些一两篇文章就能写清楚的可以记笔记或写博客, 但是如果要写成一个系列的,不如写成一本书的形式,更 ...
- laravel操作mongo详细说明
原文地址:http://returnc.com/detail/3728 一个Eloquent模型和Query构建器,支持MongoDB,使用原始的Laravel API.该库扩展了原始的Larav ...
- 1.4 Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)
当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷 ...
- SQL SERVER 日志写入原理浅析
昨天看到网上有一个关于SQL SERVER 课件,便随手下载了下来看看主要讲了些什么内容,于是看到了下面两个PPT页面 由于第一张PPT上的内容不太准确(日志文件中没有“日志页”的概念,只有VLF的概 ...
- Python之路【第二十七篇】:web服务器django
Django 一.web框架 框架,即时framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单的说,就是用别人搭建好的舞台来表演你的才艺 ...
- Java-手动搭建SSH(maven版)
创建maven项目 把maven项目变为动态网站,步骤如下: 项目结构图如下: 开始搭建spring+springmvc+Hibernate项目 环境版本就不多说了,直接贴出pom.xml文件 < ...
- POI2015 WYC
也许更好的阅读体验 \(\mathcal{Description}\) 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按路径长度排序,请输出第k小的路径的长 ...
- Teamviewer显示“未就绪,请检查您的连接”解决办法
打开TeamViewer一直提示“未就绪,请检查您的连接”,一直会弹出一个框提示检查网路设置什么. 解决办法:修改DNS为114.114.114.114,然后TeamViewer就显示网络正常. 为什 ...