Wannafly挑战赛28 msc的宠物

Wannafly挑战赛28 msc的宠物

题意:

给定一棵树,树上每个节点有权值,要求删除最多k条边使得所有联通块的最大值和最小的差最大的最小

分析:

最小化最大值,很明显是二分最大的差值D了
转化一下题目其实就是将树上的节点分成k个联通块,使得所有联通块的最大值和最小的差最大的最小。

状态:

  • f[x] 表示至少删除F[x] 个才能使得x子树差值不超过D
    • g[x][u] 表示至少删除g[x][u] 个才能使得子树最大值为a[u]

状态转移:

设y是x的子节点

  • 如果 a[y] <= a[u] <= a[y]+D,g[x][u] = min(f[y]+1,g[x][u]);(直接断开这条边或者留下这条边)
  • 否则g[x][u] = f[y]+1; (直接断开这条边)
    • f[x] = min(g[x][u]);

参考代码


#include 
#define Pb push_back
using namespace std;
typedef long long LL;
// const int    INF = 0x7FFFFFFF;
const LL     INFF =1e15;
const int maxn = 1000+10;
LL f[maxn],g[maxn][maxn];
LL a[maxn];
LL val[maxn];

std::vector G[maxn];
LL D;
 int n,k;
void dfs(int node,int fa){
  for(int i = 1;i <= n; ++i)
    {
      if(a[node] <= a[i] && a[i] <= a[node]+ D)
         g[node][i] = 0;
      else
         g[node][i] = INFF;
    }

  for(int i = 0;i < (int) G[node].size();++i){
    int v = G[node][i];
    if(v == fa) continue;
    dfs(v,node);
    for(int u = 1;u <= n; ++u){
       if(a[v] <= a[u] && a[u] <= a[v]+D)
        g[node][u]  += min(f[v]+1,g[v][u]);
       else
        g[node][u]  += f[v]+1;
    }
  }
  f[node] = INFF;
  for(int i = 1;i <= n; ++i)
    f[node] = min(f[node],g[node][i]);
}
LL check(LL mid){

  D = mid;
  dfs(1,-1);
  // cout<<D<<" "<<f[1]<<endl;
  // cout<<f[1]<<endl;
  return f[1];
}
int main(void)
{

   cin>>n>>k;
   for(int i = 1;i <= n; ++i)
      scanf("%lld",&a[i]);//,val[i] = a[i];
   // sort(val+1,val+n+1);
   for(int i = 1,v,u;i < n; ++i){
     scanf("%d%d",&u,&v);
     G[u].Pb(v);
     G[v].Pb(u);
   }
   LL l = 0,r = 1000000000+2;
   while(r >= l){
       LL mid = (r+l)>>1;
       if(check(mid)  说明差值过小
          r = mid-1;
       else
          l = mid+1;
   }
   cout<<l<<endl;

   return 0;
}
全部评论

相关推荐

Hakasee:我的简历和你的基本一样,上周去了上海,boss投了三百家, 三家线下面试 第一家没有做题,全是八股和项目,因为第一次面试不怎么熟练,挂了 第二家,给你几个题目(①css垂直居中文字,字体每两秒闪烁一下以及点击弹窗,②给你一个链接,实现可视化地图,③然后是八股,图片性能优化,以及对图片app有什么想法),45分钟内做完,然后老板面试) 第三家特别偏僻,有点阴森,到了之后让了一个工位给我,有四个题目,①格式化时间 年月日当前时间星期几② 正则表达式提取新闻文字,③在文本域输入文字生成选择题以及选项④生成商品排版还是什么来着 三家都是不超过50人的小公司 两家线上牛客笔试(卡伦特,七牛云,但是笔试不仅要考前端,还要考后端,算法,甚至数学题 我的建议是如果只做了这两个vue项目且不怎么熟练的情况下,先沉淀沉淀,把react学了,上海好的公司基本都是react查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务