前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Luogu P3237 [HNOI2014]米特运输 题解

Luogu P3237 [HNOI2014]米特运输 题解

作者头像
yzxoi
发布2022-09-19 11:35:46
1980
发布2022-09-19 11:35:46
举报
文章被收录于专栏:OI

Luogu P3237 [HNOI2014]米特运输 题解

Description

题目链接

又臭又长的题面差评

给定一棵树,该树满足一定的性质:

  1. 节点 x 的所有子节点权值必须相等
  2. 节点 x 的所有子节点的权值之和等于 x 的权值

Solution

设第 x 个节点的权值为 v,它有 sz[x] 个直系子节点,显然,这 sz[x] 个直系子节点的权值均为 \frac{v}{sz[x]}

考虑设 f[i] 表示第 i 个节点不修改时的根节点的权值。

显然可得根节点的权值为:

v[i] \times \prod sz[x] (x \in {fa}_v)

那么只要计算出 1nf[i],判断相等个数即可。

由于乘法可能会爆 long long,所以开个 mapmod 一下。

Code

代码语言:javascript
复制
#include<cstdio>
#include<vector>
#include<map>
#define LL long long
#define max(x,y) ((x)>(y)?(x):(y))
#define W while
#define I inline
#define ig(c) ('0'<=(c)&&(c)<='9')
#define gc getchar
I int read(){int x=0,f=1;char c=gc();W(!ig(c)) f=c=='-'?-1:f,c=gc();W(ig(c)) x=(x<<3)+(x<<1)+(c&15),c=gc();return x*f;}
I void write(int x){x<0&&(putchar('-'),x=-x,0),x<10?(putchar(x+'0'),0):(write(x/10),putchar(x%10+'0'),0);}
const int N=500010,mod=19260817;
int n,a[N],f[N],ans;
std::vector<int> v[N];
std::map<int,int> mp;
I void dfs(int x,int fa,int sum){
int s=0;for(auto i:v[x]) (i^fa)&&(s++,0);
++mp[(int)(1ll*sum*a[x]%mod)];
ans=max(ans,mp[(int)(1ll*sum*a[x]%mod)]);
sum=1ll*sum*s%mod;
for(auto i:v[x]) (i^fa)&&(dfs(i,x,sum),0);
}
int main(){
n=read();for(int i=1;i<=n;i++) a[i]=read();
for(int x,y,i=1;i<n;i++) x=read(),y=read(),v[x].push_back(y),v[y].push_back(x);
mp.clear();dfs(1,0,1ll);
return write(n-ans),0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-10-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Luogu P3237 [HNOI2014]米特运输 题解
    • Description
      • Solution
        • Code
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档