首页 > 其他分享 >CodeForces 1943C Tree Compass

CodeForces 1943C Tree Compass

时间:2024-03-18 11:45:38浏览次数:19  
标签:1943C typedef frac int Tree CodeForces long pb mxd

洛谷传送门

CF 传送门

发现对于一条链,一次操作最多能染黑这条链上的 \(2\) 个点。

所以我们把直径拎出来,设直径长度为 \(d\)。

考虑一条长度为 \(d\) 的链至少要多少次能全染黑。

  • 若 \(d\) 为奇数,显然从直径中点 \(u\) 开始做 \((u, 0), (u, 1), \ldots, (u, \frac{d - 1}{2})\) 即可。这样操作次数已经顶到下界了,而且发现由直径的性质,这样能把整棵树都全部染黑。
  • 若 \(d\) 为偶数,发现 \(d = 2\) 和 \(d = 4\) 时都需要 \(2\) 次。考虑若 \(d \bmod 4 = 0\),可以找到直径的中心边 \((x, y)\),依次做 \((x, 1), (y, 1), (x, 3), (y, 3), \ldots, (x, \frac{d}{2} - 1), (y, \frac{d}{2} - 1)\) 即可,只需 \(\frac{d}{2}\) 次操作。若 \(d \bmod 4 = 2\),只能做 \((x, 0), (x, 1), \ldots, (x, \frac{d}{2})\),需要 \(\frac{d}{2} + 1\) 次操作。

找直径即可。时间复杂度 \(O(n)\),开 \(2 \times 10^3\) 是因为 checker 要 \(O(n^2)\)。

code
// Problem: C. Tree Compass
// Contest: Codeforces - Codeforces Round 934 (Div. 1)
// URL: https://codeforces.com/contest/1943/problem/C
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 2020;

int n, mxd, U, fa[maxn];
vector<int> G[maxn];

void dfs(int u, int f, int d) {
	if (d > mxd) {
		mxd = d;
		U = u;
	}
	for (int v : G[u]) {
		if (v == f) {
			continue;
		}
		fa[v] = u;
		dfs(v, u, d + 1);
	}
}

void solve() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		vector<int>().swap(G[i]);
	}
	for (int i = 1, u, v; i < n; ++i) {
		scanf("%d%d", &u, &v);
		G[u].pb(v);
		G[v].pb(u);
	}
	mxd = 0;
	dfs(1, -1, 1);
	mxd = 0;
	int s = U;
	dfs(U, -1, 1);
	int t = U;
	vector<int> vc;
	for (int i = t; i != s; i = fa[i]) {
		vc.pb(i);
	}
	vc.pb(s);
	if ((int)vc.size() % 4) {
		printf("%d\n", (int)vc.size() / 2 + 1);
		for (int i = 0; i <= (int)vc.size() / 2; ++i) {
			printf("%d %d\n", vc[(int)vc.size() / 2], i);
		}
	} else {
		printf("%d\n", (int)vc.size() / 2);
		int x = vc[(int)vc.size() / 2 - 1], y = vc[(int)vc.size() / 2];
		for (int i = 0; i < (int)vc.size() / 4; ++i) {
			printf("%d %d\n%d %d\n", x, i * 2 + 1, y, i * 2 + 1);
		}
	}
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:1943C,typedef,frac,int,Tree,CodeForces,long,pb,mxd
From: https://www.cnblogs.com/zltzlt-blog/p/18080010

相关文章

  • Codeforces Round 933 Rudolf and k Bridges
    原题链接:Problem-E-Codeforces题目大意:给一个行为n列为m的河流二维数组,数字代表河流的深度。题目要求连续建造k座桥,桥的定义是从第一列到第m列,每隔d需要按照支架,安装支架的代价是深度+1。问安装最少需要多少代价?思路:单调队列优化dp,dp数组只需要一维,dp[i]的含义是从1到i建......
  • [ABC258F] Main Street 题解
    题意:你要在平面直角坐标系中行走,每一步可以上下左右四个方向任意移动$1$,耗时$k$秒。特别地,存在若干条快速通道,若该步起点和终点均满足$x\equiv0\pmod{B}$或$y\equiv0\pmod{B}$,则认为该步是在快速通道上进行,仅需耗时$1$秒。询问从$(S_x,S_y)$到$(G_x,G_y)$最......
  • codeforces 1931E
    题目链接简介:对一些数字,余念安可以反转一个数字,齐夏将两个数字首尾相连变为一个数字。每个人都采取最优策略。名单上只剩下一个号码。如果该整数不小于 10的m次方,则齐夏获胜。否则余念安就赢了。分析:博弈论问题,结局已经确定,可知变成了位数个数之争,齐夏要通过合并数字使得......
  • Codeforces Round 934 (Div. 1)
    Preface真是一场酣畅淋漓的掉分啊,一场回到解放前了属于是这把虽然有不可抗力的原因(电脑半路蓝屏了),但不知道为什么状态就特别差A刚开始没清空干净WA了2发后就心态崩了,然后加上头疼难耐B题也没看出关键trick直接写了个不仅错还巨难写的东西不过yysy这场Guess的成分是否有点太高......
  • 每日一题 第七期 Codeforces Round 929 (Div. 3) Editorial
    TurtleTenacity:ContinualModsD.TurtleTenacity:ContinualModstimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputGivenanarraya......
  • Codeforces Round 934 (Div. 2)
    CodeforcesRound934(Div.2)A-DestroyingBridges解题思路:完全图每个点的连边数为\(n-1\)。\(k<n-1\):都可到达。\(k\geqn-1\):将点\(1\)的边删完,只能呆在点\(1\)。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=......
  • P2633 Count on a tree 题解
    题目链接:Countonatree大概可以认为是树上主席树的板子我在之前的某些题解提到了,主席树一般来说有两个基本功能:可持久化功能,可以选择回退或者新增版本。对于可差性问题,可以有更好的转化为前缀和做法,常见的问题为权值类型问题。在树上的路径第\(k\)大,显然如果我们能......
  • [CF1943C] Tree Compass 题解
    不会2300,完蛋了/lh题目链接题目分析容易想到先求出直径,然后以直径中点为圆心画\({d\over2}+O(1)\)个圆。具体地,设直径点数为\(d\)。当\(d\)为奇数时,上述构造需要\(d+1\over2\)次操作;当\(d\)为偶数时,上述构造需要\({d\over2}+1\)次操作。尝试证明上述......
  • Codeforces Round 908 (Div. 2)
    CodeforcesRound908(Div.2)A-SecretSport解题思路:有一说一,没看很懂,感觉最后赢的就是赢了。。。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingpiii=pair<ll,pa......
  • Codeforces 1948G MST with Matching
    因为贡献是两个之和,考虑固定下一个,求解另一个的最优。\(\text{MST}\)似乎找不到什么好的办法固定,便考虑固定下最大匹配。对于树的最大匹配,考虑到因为树也是二分图,所以树的最大匹配\(=\)最小点覆盖。考虑如果知道了最小点覆盖内的点,那就说明如果一条边两个端点都不在点集中,是......