首页 > 其他分享 >CodeForces 1842F Tenzing and Tree

CodeForces 1842F Tenzing and Tree

时间:2023-06-25 16:24:14浏览次数:50  
标签:typedef 1842F int CodeForces long maxn Tenzing define

洛谷传送门

CF 传送门

事实上自己方向一直是错的……

绝对值不好弄,我一开始的想法是直接去绝对值,但是不可避免地要 \(O(n^3)\)。

考虑我们直接钦定黑点重心为根,设这个根为 \(r\),设 \(sz_i\) 为 \(i\) 子树内黑点数,由重心的性质,可以直接去绝对值,也就是说答案为 \(\sum\limits_{i \ne r} k - 2 sz_i\)。

考虑拆贡献,一个黑点 \(u\) 会对它的所有除了根的祖先都造成 \(-2\) 的贡献,也就是说贡献是 \(-2 \times \text{dis}(u, r)\)。于是我们贪心地选择与 \(r\) 的距离最小的染黑即可。

因为如果 \(r\) 不是重心,会产生负贡献,所以最优解一定是合法的。

时间复杂度 \(O(n^2)\)。

code
// Problem: F. Tenzing and Tree
// Contest: Codeforces - CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)
// URL: https://codeforces.com/contest/1842/problem/F
// Memory Limit: 512 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 mems(a, x) memset((a), (x), sizeof(a))

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

const int maxn = 5050;

int n, f[maxn], d[maxn];
vector<int> G[maxn];

void solve() {
	scanf("%d", &n);
	for (int i = 1, u, v; i < n; ++i) {
		scanf("%d%d", &u, &v);
		G[u].pb(v);
		G[v].pb(u);
	}
	mems(f, 0x3f);
	for (int u = 1; u <= n; ++u) {
		queue<int> q;
		for (int i = 1; i <= n; ++i) {
			d[i] = -1;
		}
		q.push(u);
		d[u] = 0;
		int s = 0;
		for (int i = 1; i <= n; ++i) {
			int v = q.front();
			q.pop();
			s += d[v] * 2;
			f[i] = min(f[i], s);
			for (int w : G[v]) {
				if (d[w] == -1) {
					d[w] = d[v] + 1;
					q.push(w);
				}
			}
		}
	}
	printf("0 ");
	for (int i = 1; i <= n; ++i) {
		printf("%d ", i * (n - 1) - f[i]);
	}
}

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

标签:typedef,1842F,int,CodeForces,long,maxn,Tenzing,define
From: https://www.cnblogs.com/zltzlt-blog/p/17503205.html

相关文章

  • Codeforces Round 875 (Div. 2) C. Copil Copac Draws Trees
    bfs解法如果是暴力求解的话就每次都扫描一次所有边直到所有点都和树连接优化:每次扫描我们可以发现会重复扫描那些已经存在树中的边了,因此我们可以只扫描还没有存在树中的边且是没扫过的边对于每次更新,比如由点a已经在树中,更新点b,我们只需判断点a被更新到树中点的编号和a-b边的......
  • Codeforces Round #879 (Div. 2) A-E
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn;cin>>n;intcnt=0;for(inti=1;i<=n;i++){intx;cin>>x;if(x==-1)cnt++;......
  • Codeforces Round 781 (Div. 2) E. MinimizOR (可持久化字典树)
    传送门题目大意:  T组测试数据每组测试数据先输入一个n表示有一个长度为n的一维数组,然后输入n个数字表示这个一维数组。紧接着输入一个k表示有k个询问,对于每个询问会输入一个l和一个r表示询问数组中[l,r]这个区间里面任意两个下标不重复的元素最小的或(|)是多少。解题思路: ......
  • Codeforces Round 881 (Div
    E.TrackingSegments给定初始长度为n,且全为0的序列a,然后给出m个线段,如果一个线段中1的个数严格大于0的个数,那么该线段称为一个漂亮线段,现在给出q次操作,每次操作使得序列a中位置x上的0变为1,请你求出第一次使得所有线段中出现漂亮线段的询问题解:二分答案容易发现答案具有单......
  • Codeforces 1603D. Artistic Partition
    题目链接:D-ArtisticPartition题目大意:要求将\([1,n]\)分成\(k\)段,使得每段对应的\(c(l,r)\)之和最小,其中\(c(l,r)=\sum_{i=l}^r\sum_{j=i}^r[\gcd(i,j)\gel]\)。首先注意到当\(r<2l\)时,\(c(l,r)=r-l+1\)。所以当\(2^k-1\gen\)时答案即为\(n\)。考虑\(\texttt......
  • Codeforces Round 766 (Div. 2) 比赛报告
    0比赛经过比赛还没开始的时候就感觉状态不太好。果然。总归到底都是一个心态问题。A题经过看A题,结果半天看不懂,一开始没有注意到一定要在黑格子上操作。扔到DeepL上翻译了一下,再手玩一下样例就做出来了,速度有点慢。CF怎么这么喜欢出分讨题啊。看题目不能太急,要一个一......
  • Codeforces Round 881 (Div. 3)--F2
    F2.OmskMetro(hardversion)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"#defineintlonglongconstintN=2e5+5;constintINF=0x3f3f3f3f;//假设一个区间的最大字段和为max最小字段和为min//那么[min,max]区间的......
  • Codeforces 1835F - Good Graph
    goodproblem,badround。判断YES还是NO很trivial,就直接跑最大匹配看看是不是\(n\)即可。如果是NO,那么考虑Hall定理的证明过程构造即可。具体方法就是找到左部任意一非匹配点,在残量网络上BFS可以到达的点,那所有可以到达的左部点形成的集合就是符合要求的反例。因为你......
  • Codeforces 1835E - Old Mobile
    首先先观察到一个非常浅显的性质:就是一个位置在序列中不是第一次出现,那么到这个位置的时候打出这个字符需要恰好一次按键,这是因为我们肯定在打出第一次出现这个字符的位置的时候已经知道哪个键对应这个字符了,到那个位置的时候直接敲一下就ok了。也就是我们只用关心这个序列中出......
  • Codeforces Round 878 (Div. 3) D. Wooden Toy Festival
    题目翻译:给定一个序列,你可以把序列分为任意的三组不要求顺序,对于每一组序列给出一个数字作为标准,求出序列中和该数字的差绝对值的最大值,现在要求你选顶三个数字使得三个序列的差最大值的最大值最小解题思路:二分,要想方差最小,就让每一组的极差都最小,即最大值减最小值最小#include......