Codeforces Round #389 (Div. 2) 752F(树的权值重心)
题目大意
给定2k个队伍分别住在2k个城市里,需要设定若干个城市,然后选取2个队伍要在它们的最短路径上设一个城市作为休息站
要求设立最少的休息站,然后输出如何安排2个队伍
首先若干个其实就是在坑人,实际上1个就可以了
这一个点就是树的权值重心。
权值重心的定义:若选取权值重心为根,则它的任意子树的权值和不会大于所有子树权值和的二分之一
那么接下来证明权值重心是可行的
只需要构造出来一组分组即可
我是这么构造的
先搜每一个子树,搜集齐k个点放到A,然后继续搜集剩下的点放到B,如果权值重心上也有队伍,那么就把它加到B
然后依次输出A[i],B[i]即可
这样做是可行的,因为任意子树的权值和不会大于所有子树权值和的二分之一。(稍微想想就可以知道啦)
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn = ;
vector<int> G[maxn];
queue<int> Q[];
int f[maxn], v[maxn], sz[maxn], son[maxn];
int n, k, x, y, X; void dfs(int x, int fa)
{
for(int i = ; i < G[x].size(); i++)
{
int to = G[x][i];
if(fa == to) continue;
dfs(to, x);
sz[x] += sz[to];
son[x] = max(son[x], sz[to]);
}
son[x] = max(son[x], *k - sz[x]);
} void dfs2(int x, int fa, int c)
{
if(!f[x] && Q[c-].size() < k && v[x])
{
f[x] = c;
Q[c-].push(x);
}
for(int i = ; i < G[x].size(); i++)
{
int to = G[x][i];
if(fa == to) continue;
dfs2(to, x, c);
}
} int main()
{
cin>>n>>k;
for(int i = ; i < n; i++)
{
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
for(int i = ; i <= *k; i++) cin>>x, sz[x] = v[x] = ;
dfs(, );
for(int i = ; i <= n; i++)
if(son[i] <= k) X = i;
cout<<<<endl<<X<<endl;
for(int i = ; i < G[X].size(); i++)
{
if(Q[].size() < k)
dfs2(G[X][i], X, );
if(Q[].size() == k)
dfs2(G[X][i], X, );
}
if(Q[].size() == k-) Q[].push(X);
while(!Q[].empty())
{
cout<<Q[].front()<<" "<<Q[].front()<<" "<<X<<endl;
Q[].pop(); Q[].pop();
}
}
Codeforces Round #389 (Div. 2) 752F(树的权值重心)的更多相关文章
- Codeforces Round #389(div 2)
A =w= B QvQ C 题意:在一个格子图里给出一个路径 里面有UDLR四种移动方向 问 我在格子路径里面最少选几个点 可以让我沿着格子路径走 其实是在相邻的点与点之间走最短路 分析:贪心+模拟 ...
- Codeforces Round #389 Div.2 D. Santa Claus and a Palindrome
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces Round #365 (Div. 2) D 树状数组+离线处理
D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...
- Codeforces Round #261 (Div. 2) D 树状数组应用
看着题意:[1,i]中等于a[i]的个数要大于[,jn]中等于a[j]的个数 且i<j,求有多少对这种(i,j) ,i<j可是 i前面的合法个数 要大于j后面的 看起来非常像逆序数的样子 ...
- Codeforces Round #218 (Div. 2) (线段树区间处理)
A,B大水题,不过B题逗比了题意没理解清楚,讲的太不清楚了感觉= =还是英语弱,白白错了两发. C: 二分答案判断是否可行,也逗比了下...二分的上界开太大导致爆long long了... D: ...
- Codeforces Round #425 (Div. 2) D 树链剖分 + 树状数组维护区间
一看就知道 可以LCA判断做 也可以树链剖分拿头暴力 然而快速读入和线段树维护区间会T70 于是只能LCA? 线段树的常数不小 于是需要另外一种办法来进行区间加减和查询区间和 就是使用树状数组 这个题 ...
- Codeforces Round #389 (Div. 2,) B C
考完复变之后沉迷联盟不能自拔...明天就开始抢救计组 ... B 一个人装错了键帽 选择几个pair 把pair里面的键帽交换 并且每个键帽最多可以换一次 给出按键序列和输出序列 判断是否可以 如果可 ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) C
Description Santa Claus has Robot which lives on the infinite grid and can move along its lines. He ...
- Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) B
Description Santa Claus decided to disassemble his keyboard to clean it. After he returned all the k ...
随机推荐
- securecrt颜色设置
https://blog.csdn.net/zq710727244/article/details/53909801
- CMD批处理复制目录下所有文件
从我接触编程时,WIN7已经是最普及的系统了. 有一天,我需要在服务器更新某个软件或游戏的时候,我都需要先在其中一台服务器下载更新, 然后同步到其他服务器,而且这种操作也是非常频繁的,我就想写个批处理 ...
- Session的生命同期
一.什么是Session,怎么用 Session是存放用户与web服务器之间的会话,即服务器为浏览器开辟的存储空间. 由于浏览器与服务器之间的会话是无状态(无状态的意思是会话之间无关联性,无法识别该用 ...
- OpenLDAP部署目录服务
文档信息 目 的:搭建一套完整的OpenLDAP系统,实现账号的统一管理. 1:OpenLDAP服务端的搭建 ...
- js匿名函数运行的方法
Javascript中定义函数的方式有多种,函数直接量就是其中一种.如var fun = function(){},这里function如果不赋值给fun那么它就是一个匿名函数.好,看看匿名函数的如何 ...
- #Python编程从入门到实践#第四章笔记
#Python编程从入门到实践#第四章笔记 操作列表 1.遍历列表 使用for循环,遍历values列表 for value in values: print(value) 2.数字列表 使 ...
- ERROR 1005 (HY000): Can't create table 'students.#sql-d9
今天在创建外键的时候出现以下错误 ERROR 1005 (HY000): Can't create table 'students.#sql-d99_3' (errno: 150) 格式 ...
- POJ-2251 三维迷宫
题目大意:给一个三维图,可以前后左右上下6种走法,走一步1分钟,求最少时间(其实就是最短路) 分析:这里与二维迷宫是一样的,只是多了2个方向可走,BFS就行(注意到DFS的话复杂度为O(6^n)肯定会 ...
- 牛客网暑期ACM多校训练营(第四场) F Beautiful Garden
链接: https://www.nowcoder.com/acm/contest/142/F 题意: n x m的矩形,选个p x q的矩形去掉,两个矩形中⼼重合,去掉后的矩形上下左右对称 求(p, ...
- [Codeforces86D]Powerful array(莫队算法)
题意:定义K[x]为元素x在区间[l,r]内出现的次数,那么它的贡献为K[x]*K[x]*x 给定一个序列,以及一些区间询问,求每个区间的贡献 算是莫队算法膜版题,不带修改的 Code #includ ...