关闭

Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) F

189人阅读 评论(0) 收藏 举报
分类:

题意:

在一片名为treeland的土地上,要举办一次球赛,,这片土地上的n个城市刚好构成一棵树,一共有2k个不同的城市都派出了参赛队伍。首先,要把它们分成k个小组,每个小组刚好两队,每个队只能被分到一组。然后,同一组的两个队会分别在一方的城市进行一场比赛,为此,需要给每组球员安排休息地,每组的休息地要求在该组两个城市最短路径上的一个点。不同组别的休息地可以重叠,要求总的选择的休息地最少。输出最少的休息地数量,以及一个分组方案。 n <= 2E5


solution:

先将这2k个点标记,称作关键点。显然,这棵树上存在一个点,使得以它为根时,所有儿子的子树中,含有关键点数量最大的那个子树的数量不超过k。证明的话,可以先任意找一个点作为目标点,对于它的所有儿子,找到那个含关键点数最多的,如果它的权值小于k,说明找到这个点,否则,目标点往这个儿子调整,其它子树的权值和不超过k,重复执行这种操作,权值最大的那个子树,权值不断减少,总能调整到。

现在找到了这个节点,能证明,在这个点建立休息处,总能找到至少一种配对方案,使得所有路径都经过这个点,只要有办法构造出来就行了。构造的话,每次拿一棵子树,把里面的关键点全部写出来,当所有儿子都操作完以后,就构成一个序列,只要将所有(i,i+k)配对就行了,因为每棵子树的权值不超过k,所以i和i+k一定在两棵不同的子树,既然在不同的子树,就必定经过根

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;

const int maxn = 2E5 + 20;

int n,k,rt,tot,siz[maxn],A[maxn];
bool bo[maxn];

vector <int> v[maxn];

void Dfs1(int x,int fa)
{
	siz[x] = bo[x] ? 1 : 0;
	for (int i = 0; i < v[x].size(); i++)
	{
		int to = v[x][i];
		if (to == fa) continue;
		Dfs1(to,x); siz[x] += siz[to];
	}
} 

void Dfs2(int x,int fa)
{
	bool pass = 0; int Nex;
	for (int i = 0; i < v[x].size(); i++)
	{
		int to = v[x][i];
		if (to == fa) continue;
		if (siz[to] > k) pass = 1,Nex = to;
	}
	if (!pass) rt = x; else Dfs2(Nex,x);
}

void Dfs3(int x,int fa)
{
	if (bo[x]) A[++tot] = x;
	for (int i = 0; i < v[x].size(); i++)
	{
		int to = v[x][i];
		if (to == fa) continue;
		Dfs3(to,x);
	}
}

int main()
{
	#ifdef DMC
		freopen("DMC.txt","r",stdin);
	#endif
	
	cin >> n >> k;
	for (int i = 1; i < n; i++)
	{
		int x,y; scanf("%d%d",&x,&y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	for (int i = 1; i <= 2*k; i++)
	{
		int x; scanf("%d",&x); bo[x] = 1;
	}
	Dfs1(1,0); Dfs2(1,0);
	if (bo[rt]) A[++tot] = rt;
	for (int i = 0; i < v[rt].size(); i++)
		Dfs3(v[rt][i],rt);
	printf("1\n%d\n",rt);
	for (int i = 1; i <= k; i++) 
		printf("%d %d %d\n",A[i],A[i+k],rt);
	return 0;
}

0
0
查看评论

Codeforces Round #445 (Div. 1, based on Technocup 2018 Elimination Round 3) E. Mod Mod Mod

E. Mod Mod Mod time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output You are given a sequence...
  • zstu_zy
  • zstu_zy
  • 2017-12-01 17:11
  • 62

Educational Codeforces Round 36 (Rated for Div. 2) 题解

先总结一波 第一次打cf,感觉还不错,题目做得挺顺手。虽然开始30min才想起来有这么个比赛来着。。 纪念一下第一次的rank,话说题真是水 这是大概还剩下5min的时候截的,实际可能会掉一点吧 第二天更新: 原来d题真的会被卡,果然还是要tarjan找一个环来删边 hackin...
  • jpwang8
  • jpwang8
  • 2018-01-13 23:16
  • 239

Educational Codeforces Round 33 (Rated for Div. 2) F. Subtree Minimum Query (线段树)

题目链接:http://codeforces.com/contest/893/problem/F 这个题好像挺傻逼的啊? 首先dfs序,然后线段树维护,每个节点维护一个vector表示这个区间中所有的节点的深度,这样的空间复杂度为O(nlogn),因为不涉及修改,咱们的对每个节点的vector都...
  • sinat_32872703
  • sinat_32872703
  • 2017-11-29 20:47
  • 89

Educational Codeforces Round 36 (Rated for Div. 2) C 不大于某个数的序列变换

C. Permute Digitstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are given two positive integ...
  • Little_boy_z
  • Little_boy_z
  • 2018-01-19 12:42
  • 32

Codeforces Round #413 Div. 2 D. Field expansion

D. Field expansion time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output In one of the games A...
  • qq_33183401
  • qq_33183401
  • 2017-05-14 22:52
  • 198

Codeforces Round #258 (Div. 2)-(A,B,C,D,E)

A:Game With Sticks 水题。。。每次操作,都会拿走一个横行,一个竖行。 所以一共会操作min(横行,竖行)次。 #include #include #include #include #include #include #include #include #pragma commen...
  • rowanhaoa
  • rowanhaoa
  • 2014-07-25 14:39
  • 1471

Educational Codeforces Round 37 (Rated for Div. 2)【A B C】【水】【模拟】

嗖的一下! A #include using namespace std; #define ll long long int a[500]; int c[500]; int main() { int N; cin >> N; while(N--) { ...
  • Head_Hard
  • Head_Hard
  • 2018-02-03 16:18
  • 56

【解题报告】Codeforces Round #401 (Div. 2)

简略的解题报告。
  • TRiddle
  • TRiddle
  • 2017-02-25 17:55
  • 410

Codeforces Round #395 (Div. 2)(ABCD)

ps:打完这场cf才知道自己真的很菜,还是停留在AB题的水平,有时候CD其实很简单,但就是想不到,别人一眼看出而我就是想不到,有时候想到了点子上但就是突破不了 题目链接:  Codeforces Round #395 (Div. 2) A题: &...
  • qq_34731703
  • qq_34731703
  • 2017-02-03 12:50
  • 488

ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) E. The Holmes Children

E. The Holmes Children time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard ...
  • mystery_guest
  • mystery_guest
  • 2017-03-04 18:40
  • 284
    个人资料
    • 访问:201917次
    • 积分:8922
    • 等级:
    • 排名:第2543名
    • 原创:733篇
    • 转载:1篇
    • 译文:0篇
    • 评论:16条
    文章分类
    最新评论