NC20110. [HNOI2014]米特运输
描述
输入描述
第一行是一个正整数N,表示城市的数目。
接下来N行,每行一个正整数,其中的第i行表示第i个城市原来存在的米特储存器的容量。
再接下来是N-1行,每行两个正整数a,b表示城市b到城市a有一条高速通道(a≠b)。 N < 500000,A[j] < 10^8
输出描述
输出文件仅包含一行,一个整数,表示最少的被重建(即修改储存器容量)的米特储存器的数目。
示例1
输入:
5 5 4 3 2 1 1 2 1 3 2 4 2 5
输出:
3
C++14(g++5.4) 解法, 执行用时: 234ms, 内存消耗: 13156K, 提交时间: 2019-10-29 22:15:11
// luogu-judger-enable-o2 //It is made by M_sea #include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> #define re register using namespace std; inline int read() { int X=0,w=1; char c=getchar(); while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); } while (c>='0'&&c<='9') X=X*10+c-'0',c=getchar(); return X*w; } const int N=500000+10; const double eps=1e-8; struct Edge { int v,nxt; } e[N]; int head[N]; inline void addEdge(int u,int v) { static int cnt=0; e[++cnt]=(Edge){v,head[u]},head[u]=cnt; } int n; int a[N],deg[N]; double f[N]; inline void dfs(int u,int fa,double s) { f[u]=s+log(a[u]); for (re int i=head[u];i;i=e[i].nxt) { int v=e[i].v; if (v==fa) continue; dfs(v,u,s+log(deg[u])); } } int main() { n=read(); for (re int i=1;i<=n;++i) a[i]=read(); for (re int i=1;i<n;++i) { int u=read(),v=read(); addEdge(u,v),++deg[u]; } dfs(1,0,log(1)); sort(f+1,f+n+1); int ans=0; for (re int i=2,cnt=1;i<=n;++i) { if (f[i]-f[i-1]<=eps) ans=max(ans,++cnt); else cnt=1; } printf("%d\n",n-ans); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 893ms, 内存消耗: 36952K, 提交时间: 2020-03-27 21:53:53
#include<bits/stdc++.h> using namespace std; const int N=5e5+100; vector<int>G[N]; double sum[N],a[N]; void dfs(int x,int fa,double ss) { sum[x]=ss+log(a[x]); for(int v:G[x]) { if(v==fa) continue; if(x==1)dfs(v,x,ss+log(G[x].size())); else dfs(v,x,ss+log(G[x].size()-1)); } } int main() { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<n;i++) { int x,y; cin>>x>>y; G[x].push_back(y); G[y].push_back(x); } dfs(1,0,0); sort(sum+1,sum+1+n); int len=1,ans=0; for(int i=2;i<=n;i++) { if(sum[i]-sum[i-1]<1e-10) { len++; ans=max(ans,len); } else len=1; } cout<<n-ans<<endl; return 0; }