嘤嘤嘤嘤

版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/82844834

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
#define mn 1111111
#define db double
using namespace std;
struct node{
 int x,y;
}e[mn];
const int INF=2e9;
int n,mod,c,a[mn],v[mn],h[mn],q[mn],vis[mn];
db ans,f[mn][2],s[mn],p[mn],eps=1e-7;
void add(int x,int y)
{
 e[++c].x=h[x];
 e[c].y=y;
 h[x]=c;
}
void dfs(int x,int y,db z)
{
    for (int i=h[x];i>0;i=e[i].x)
  if(e[i].y!=y)
   dfs(e[i].y,x,z);
    q[0]=s[0]=0;
 p[0]=-1*INF;
    for (int i=h[x];i>0;i=e[i].x)
  if (e[i].y!=y)
   q[++q[0]]=e[i].y;
    for (int i=1;i<=q[0];i++)
 {
  s[i]=s[i-1]+f[q[i]][1];
  p[i]=max(p[i-1]+f[q[i]][1],s[i-1]+f[q[i]][0]);
 }
    f[x][0]=s[q[0]]+v[x]-z; f[x][1]=s[q[0]];
    for (int i=1;i<=q[0];i++)
    {
     f[x][0]=max(f[x][0],f[q[i]][0]+s[q[0]]-f[q[i]][1]+v[x]);
  f[x][1]=max(f[x][1],f[q[i]][0]+p[i-1]+v[x]+z+s[q[0]]-s[i]);
 }
    f[x][1]=max(f[x][1],f[x][0]);
}
void solve(int x)
{
    db l=ans,r=1e9,m;
    for(int i=1;i<=n;i++)
  v[i]=(a[i]+x)%mod;
    dfs(1,0,ans+eps);
    if (max(f[1][0],f[1][1])<ans+eps)
  return;
    while (r-l>eps)
 {
  m=(l+r)/2.0;
  dfs(1,0,m);
        if (max(f[1][0],f[1][1])>=m)
   l=m;
  else
   r=m;
    }
    ans=l;
}
int main()
{
 int i,x,y,k,m;
    scanf("%d%d",&n,&mod);
    for (i=1;i<=n;i++)
 {
  scanf("%d",a+i);
  a[i]%=mod;
  m=max(m,a[i]);
 }
    for (i=1;i<n;i++)
 {
  scanf("%d%d",&x,&y);
  add(x,y);
  add(y,x);
 }
    scanf("%d",&k);
    for (i=1;i<=n;i++)
 {
  x=mod-a[i]-1;
  if (x<=k&&!vis[x])
  {
   solve(x);
   vis[x]=1;
  }
 }
    if (mod-k-1>m)
  solve(k);
    printf("%.6lf",ans);
}

来源:zr

猜你喜欢

转载自blog.csdn.net/qq_42500298/article/details/82844834
今日推荐