[cf]|[cf] 1401 D.Maximum Distributed Tree

题目 [cf]|[cf] 1401 D.Maximum Distributed Tree
文章图片

题目链接:https://codeforces.ml/contest/1401/problem/D
思路 计算每个边的经过次数,然后把最大的p分配给次数最多的即可。
不过要讨论 m>n-1 的时候
还有
如果要sort
千万
千万
千万



代码

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #include #endif #define int long long using namespace std; const int INF = 0x3f3f3f3f; const int mod = 1e9+7; vector v[100010]; int m,p[100010],num[100010]; int a[100010]; void dfs(int n,int fa,int res){ num[n]=1; for(int i=0; i>t; while(t--){ int n; cin>>n; for(int i=1; i<=n+1; i++) v[i].clear(),num[i]=0,a[i]=0,p[i]=0; for(int i=1; i<=n-1; i++){ int u1,v1; cin>>v1>>u1; v[v1].push_back(u1); v[u1].push_back(v1); } cin>>m; for(int i=1; i<=m; i++){ cin>>p[i]; } dfs(1,0,n); //求通过次数 sort(p+1,p+1+m,greater()); sort(a+1,a+1+n,greater()); int res=0; if(n-1>=m){ for(int i=1; i<=n-1; i++){ if(!p[i]) p[i]=1; res=(res+a[i]*p[i]%mod)%mod; } } else{ int d=m,k=1; while(d>=n){ d--; k++; p[k]=p[k]*p[k-1]%mod; } // for(int i=k; i<=m; i++) cout<【[cf]|[cf] 1401 D.Maximum Distributed Tree】for(int i=1,j=k; i<=n-1,j<=m; i++,j++){ res=(res+a[i]*p[j]%mod)%mod; } } cout<

    推荐阅读