当前位置: 首页 > news >正文

[cogs2652]秘术「天文密葬法」

题意:就是每个点有权值\(a_i,b_i\),选出一条长为\(m\)的路径(这里的长指的是路径点数),并最小化\(\frac{\sum a_i}{\sum b_i}\)

先膜一下zsy大佬

首先这显然是个分数规划,我们二分一个答案\(mid\),判断\(\frac{\sum a_i}{\sum b_i}\leq mid\),即\(\sum a_i-mid\sum b_i\leq 0\)

后面这个显然可以dp,记\(f[u][j]\)表示从\(u\)往下的长度为\(j\)的链中最小的权值是多少,很明显可以\(O(n^2)\)转移

考虑如何优化,用长链剖分,每个节点继承它重儿子的信息,轻儿子的信息直接暴力合并

不知道什么是长链剖分的可以看看蒟蒻的笔记

不过因为每个节点继承它重儿子的信息后要全部加上自己的值,所以可以每个点开一个变量来表示加了多少

//minamoto
#include<bits/stdc++.h>
#define eps 1e-3
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[1<<21],*p1=buf,*p2=buf;
int read(){
    int res,f=1;char ch;
    while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
    for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
    return res*f;
}
const int N=2e5+5;
int head[N],Next[N<<1],ver[N<<1],tot;
inline void add(int u,int v){ver[++tot]=v,Next[tot]=head[u],head[u]=tot;}
int n,m,a[N],b[N],len[N],son[N];
double val[N],tmp[N],*f[N],*id=tmp,ans=1e18,l,r,mid;
void dfs(int u,int fa){
    for(int i=head[u];i;i=Next[i])if(ver[i]!=fa){
        dfs(ver[i],u);
        if(len[ver[i]]>len[son[u]])son[u]=ver[i];
    }
    len[u]=len[son[u]]+1;
}
void dp(int u,int fa){
    val[u]=a[u]-mid*b[u],f[u][0]=0;
    if(son[u])f[son[u]]=f[u]+1,dp(son[u],u),val[u]+=val[son[u]],f[u][0]-=val[son[u]];
    for(int i=head[u];i;i=Next[i]){
        int v=ver[i];if(v==fa||v==son[u])continue;
        f[v]=id,id+=len[v],dp(v,u);
        for(int j=0;j<len[v]&&j<m;++j)
        if(m-j-1<len[u])ans=min(ans,f[v][j]+val[v]+f[u][m-j-1]+val[u]);
        for(int j=0;j<len[v]&&j<m;++j)
        f[u][j+1]=min(f[u][j+1],f[v][j]+val[v]-val[u]+a[u]-mid*b[u]);
    }
    if(m<len[u])ans=min(ans,f[u][m]+val[u]);
}
int main(){
//  freopen("testdata.in","r",stdin);    
    freopen("cdcq_b.in","r",stdin);
    freopen("cdcq_b.out","w",stdout);
    n=read(),m=read()-1;
    for(int i=1;i<=n;++i)a[i]=read();
    for(int i=1;i<=n;++i)b[i]=read();
    for(int i=1;i<=n;++i)ans=min(ans,1.0*a[i]/b[i]);
    if(m==-2||!m)return printf("%.2lf\n",ans),0;
    for(int i=1,u,v;i<n;++i)u=read(),v=read(),add(u,v),add(v,u);
    dfs(1,0);l=0,r=N;
    while(r-l>eps){
        mid=(l+r)/2;
        memset(tmp,0x7f,sizeof(tmp)),ans=1e18;
        id=tmp,f[1]=id,id+=len[1],dp(1,0);
        if(ans>=0)l=mid;else r=mid;
    }
    if(l>=200000)puts("-1");else printf("%.2lf\n",l);
    return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/9948716.html

相关文章:

  • 【AliOS Things学习笔记】在Developerkit开发板上运行blink例程
  • 黑盒测试的测试方法
  • 开发阶段
  • angular2+ 生命周期
  • 可见面判别算法---光线投射算法
  • [每日短篇] 10 - Docker 清理无用的镜像
  • 书摘—极致产品
  • 0013-如何在Kerberos与非Kerberos的CDH集群BDR不可用时复制数据
  • MySQL数据类型详解
  • React和Redux的连接react-redux
  • VUE-文字跑马灯
  • 虚拟机与Docker有何不同?
  • 命令执行
  • Cesium入门6 - Adding Imagery - 添加图层
  • Python 一行代码完成局域网文件共享
  • ➹使用webpack配置多页面应用(MPA)
  • Fastjson的基本使用方法大全
  • Github访问慢解决办法
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Mithril.js 入门介绍
  • rabbitmq延迟消息示例
  • Vue 重置组件到初始状态
  • 对象管理器(defineProperty)学习笔记
  • 利用jquery编写加法运算验证码
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端代码风格自动化系列(二)之Commitlint
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 用Python写一份独特的元宵节祝福
  • Mac 上flink的安装与启动
  • Spring Batch JSON 支持
  • 阿里云ACE认证之理解CDN技术
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • # .NET Framework中使用命名管道进行进程间通信
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #Linux(make工具和makefile文件以及makefile语法)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (11)MATLAB PCA+SVM 人脸识别
  • (pytorch进阶之路)扩散概率模型
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计高校学生选课系统
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)jQuery 基础
  • (转)用.Net的File控件上传文件的解决方案
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET企业级应用架构设计系列之应用服务器
  • .NET运行机制
  • .NET中GET与SET的用法
  • @property @synthesize @dynamic 及相关属性作用探究