[CF1375G] Tree Modification
Problem:题目链接
Solution:
非常巧妙的一道全局思维题。
观察操作的性质。假设当前 a 为根,相当于将 a 的不包含 c 的子树全部接到 c 上,然后此时以 c 为根,a 为 c 的孩子节点。设 deproot=0,我们发现,一次操作使得 depa 从 0 变为 1,操作前以 a 为根的 c 的子树内节点的 dep 都减去 2。这说明一次操作只会使得一个节点的深度的奇偶性发生变化。
考虑树上节点深度奇偶性变化的实质。我们知道树是一个二分图,那么可以对树进行黑白染色,深度为偶数和奇数的节点的颜色不相同。现在问题转化为:一次操作可以改变一个节点的颜色,问最少多少次操作可以使得黑点或白点出现 n−1 次。
那么一遍 DFS 就可以得到答案。
Code:
#include <bits/stdc++.h>
#pragma GCC optimize(3)
#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
using namespace std; const int N=400010;
inline int read()
{
int s=0, w=1; ri char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
return s*w;
}
int n,W,B;
int head[N],maxE; struct Edge { int nxt,to; }e[N<<1];
inline void Add(int u,int v) { e[++maxE].nxt=head[u]; head[u]=maxE; e[maxE].to=v; }
void DFS(int x,int fa,int dep)
{
if(dep&1) W++;
else B++;
for(ri int i=head[x];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa) continue;
DFS(v,x,dep+1);
}
}
signed main()
{
n=read();
for(ri int i=1;i<n;i++)
{
int u,v;
u=read(), v=read();
Add(u,v), Add(v,u);
}
DFS(1,0,0);
printf("%lld\n",min(W,B)-1);
return 0;
}
夜畔流离回,暗叹永无殿。
独隐万花翠,空寂亦难迁。
千秋孰能为,明灭常久见。
但得心未碎,踏遍九重天。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签