Codeforces 764C Timofey and a tree 题解

这是一篇关于Codeforces编程竞赛764C题目的题解,主要讨论如何寻找一棵无根树中使得所有子树颜色一致的根节点。文章介绍了思路,具体解决方法以及实现时的注意事项。

题意简述

给定一颗无根树,每个点有颜色,请确定一个点,使得以这个点为根,则所有子树中都是一个颜色。为防歧义,良心插图。

如图:

思路

ccc为满足链接的两个点颜色不一样的边(简称“异色边”)的个数。找到一个点,使得这个点连出去的异色边数量==C==C==C,那么这个点就是我们要找的根。否则就没有这样的根。

具体思路

这个题还是很巧妙的,如果第一次做完全不会想到。别急,慢慢分析。

如右图,设我们要选的点是点kkkccc的定义同“思路”中的定义。那么,我们会发现,由于子树中的颜色都是一样的,所以异色边仅有在kkk和儿子的连边中出现。所以,如果有一个满足条件的kkk,那么这个kkk点连出去的异色边的数量肯定就等于全局的异色边数量ccc

实现注意

由于我们只需要遍历边,所以只要开一个structstructstruct数组存下来边即珂。

代码

#include<bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet
{
	#define N 155555
	#define F(i,l,r) for(int i=l;i<=r;++i)
	#define D(i,r,l) for(int i=r;i>=l;--i)
	#define Fs(i,l,r,c) for(int i=l;i<=r;c)
	#define Ds(i,r,l,c) for(int i=r;i>=l;c)
	#define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))
	#define MEM(x,a) memset(x,a,sizeof(x))
	#define FK(x) MEM(x,0)
	int n;
	struct Edge//快速遍历边
	{
		int u,v;
	}E[N];int cnt=0;
	int val[N];
	void R1(int &x)
	{
	    x=0;char c=getchar();int f=1;
	    while(c<'0' or c>'9') f=(c=='-')?-1:1,c=getchar();
	    while(c>='0' and c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
	    x=(f==1)?x:-x;
	}

	void Input()
	{
		R1(n);
		F(i,1,n-1)
		{
			int u,v;
			R1(u),R1(v);
			E[++cnt]=(Edge){u,v};
		}
		F(i,1,n) R1(val[i]);
	}

	int ddeg[N];//different degree
	void Soviet()
	{
		int sum=0;

		F(i,1,cnt)
		{
			int u=E[i].u,v=E[i].v;
			if (val[u]!=val[v]) ++sum,++ddeg[u],++ddeg[v];
		}

		F(i,1,n)
		{
			if (ddeg[i]==sum)
			{
				puts("YES");
				printf("%d\n",i);
				return;
			}
		}
		puts("NO");
	}
	void IsMyWife()
	{
		Input();
		Soviet();
	}
}
int main()
{
	Flandre_Scarlet::IsMyWife();
	getchar();getchar();
	return 0;
}
Codeforces 上的比赛结束后,题解的开放时间取决于比赛的类型和主办方的安排。通常情况下,**Educational Round** 和 **Regular Round** 的题解会在比赛结束后立即开放[^1]。然而,部分比赛可能会设置延迟开放题解的机制,以防止比赛期间解法被公开传播,尤其是在涉及排名或奖惩机制的正式比赛中。 对于大多数比赛,如果题解没有立即开放,通常会在几个小时内开放。有时主办方会在比赛结束后的 12 小时内开放题解,例如在 Educational Round 中,比赛结束后通常会有 12 小时的全网开放 hack 时间,之后题解也会同步开放[^1]。 如果用户在比赛结束后无法查看题解,并显示“N/A”,可能是由于以下原因: - 题解尚未开放,需等待主办方更新。 - 页面加载异常,可尝试刷新页面或清除浏览器缓存。 - 用户访问的页面并非官方题解页面,建议前往 Codeforces 的官方博客或比赛公告中查找题解链接。 此外,Codeforces 社区活跃,即使官方题解尚未开放,也可以在比赛结束后的讨论区、博客或评论区中找到参赛者分享的解题思路和代码[^3]。 ### 示例:获取 Codeforces 比赛题解的 Python 脚本 ```python import requests from bs4 import BeautifulSoup def fetch_solution(contest_id, problem_index): url = f"https://codeforces.com/contest/{contest_id}/problem/{problem_index}" response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') solution = soup.find('div', {'class': 'problem-statement'}) if solution: return solution.get_text() else: return "题解尚未开放或页面结构异常。" else: return "无法访问该页面。" # 示例:获取某场比赛的 A 题题解 print(fetch_solution(1700, 'A')) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值