2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)
传送门
题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi∑ai的最大值。
思路:一眼要01分数规划,考虑checkcheckcheck可以用点分治水掉。
然而也可以用长链剖分,复杂度降低一个logloglog。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef long long ll;
const int N=1e5+5;
int mdep[N],dep[N],top[N],hson[N],len[N],fa[N],n,m,a[N],b[N];
vector<int>e[N];
double ans,w[N],ftmp[N<<1],*f[N],*tmp;
void dfs1(int p){
for(ri i=0,v;i<e[p].size();++i){
if((v=e[p][i])==fa[p])continue;
fa[v]=p,mdep[v]=dep[v]=dep[p]+1,dfs1(v),mdep[p]=max(mdep[p],mdep[v]);
if(mdep[hson[p]]<mdep[v])hson[p]=v;
}
len[p]=mdep[p]-dep[p]+1;
}
void dfs2(int p){
if(hson[p])f[hson[p]]=f[p]+1,dfs2(hson[p]);
for(ri i=0,v;i<e[p].size();++i){
if((v=e[p][i])==fa[p]||v==hson[p])continue;
f[v]=tmp,tmp+=len[v],dfs2(v);
}
}
void dfs3(int p){
f[p][0]=(w[p]+=w[fa[p]]);
if(!hson[p])return;
dfs3(hson[p]);
for(ri i=0,v;i<e[p].size();++i){
if((v=e[p][i])==fa[p]||v==hson[p])continue;
dfs3(v);
for(ri j=0;j<len[v];++j)if(j+1+len[p]>m&&m>j)ans=min(ans,f[p][m-j-1]+f[v][j]-(w[p]+w[fa[p]]));
for(ri j=0;j<len[v];++j)f[p][j+1]=min(f[p][j+1],f[v][j]);
}
if(len[p]>m)ans=min(ans,f[p][m]);
}
int main(){
n=read(),m=read();
for(ri i=1;i<=n;++i)a[i]=read();
for(ri i=1;i<=n;++i)b[i]=read();
for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
if(m<0){for(int i=1;i<=n;++i)ans=min(ans,(double)a[i]/b[i]);return printf("%.2lf\n",ans),0;}
dfs1(1);
tmp=ftmp,f[1]=tmp,tmp+=mdep[1];
dfs2(1);
--m;
double l=0.0,r=1e9;
while(r-l>=1e-3){
double mid=(l+r)/2;
ans=1e18;
for(ri i=1;i<=n;++i)w[i]=(double)a[i]-mid*b[i];
dfs3(1);
ans<=0?r=mid:l=mid;
}
printf("%.2lf",l);
return 0;
}
2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)的更多相关文章
- 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)
[COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...
- cogs 2652. 秘术「天文密葬法」(0/1分数规划 长链剖分 二分答案 dp
http://cogs.pro:8080/cogs/problem/problem.php?pid=vSXNiVegV 题意:给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai ...
- 2019.01.21 bzoj1758: [Wc2010]重建计划(01分数规划+长链剖分+线段树)
传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)
LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...
- [COGS2652]秘术「天文密葬法」
description 题面 给个树,第\(i\)个点有两个权值\(a_i\)和\(b_i\),现在求一条长度为\(m\)的路径,使得\(\frac{\sum a_i}{\sum b_i}\)最小 d ...
- 2019.03.11 bzoj4813: [Cqoi2017]小Q的棋盘(贪心)
传送门 考虑最后所有走过的点构成的树,显然除了最长链走一遍以外每条轻链都走两遍. 于是求一波最长链搞一搞就完了. 注意几个小细节特判qwq 代码: #include<bits/stdc++.h& ...
- 2018.11.03 NOIP模拟 树(长链剖分优化dp)
传送门 考虑直接推式子不用优化怎么做. 显然每一个二进制位分开计算贡献就行. 即记录fi,jf_{i,j}fi,j表示距离iii这个点不超过jjj的点的每个二进制位的0/10/10/1个数. 但直接 ...
- LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分
传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...
随机推荐
- python中os模块操作目录与文件名小结
(1). 创建目录: SigleDir = 'sigle_layer' MultiDir = 'D:\\Web\\multi_layer' 创建单层目录: os.mkdir(SigleDir) 创建多 ...
- ARTS打卡计划第一周-Review
本周分享的文章来自于medium的 Testing Best Practices for Java + Spring Apps 这个文章主要讲的是java测试的一些最佳实践 1.避免函数返回void, ...
- OSVOS 半监督视频分割入门论文(中文翻译)
摘要: 本文解决了半监督视频目标分割的问题.给定第一帧的mask,将目标从视频背景中分离出来.本文提出OSVOS,基于FCN框架的,可以连续依次地将在IMAGENET上学到的信息转移到通用语义信息,实 ...
- sql server数据库文件的迁移(mdf&ldf文件)
mdf 源文件 ldf 日志文件 在服务器不同磁盘目录内做迁移.移动用户数据库文件的情况大致有下面一些: ① 没有设计规划好,贪图方便,,,,数据库文件和日志文件增长过快,导致存放数据库文件的磁盘空间 ...
- Java框架spring 学习笔记(七):Spring相关概念
Spring是开源.轻量级.一站式框架. Spring核心主要两部分 aop:面向切面编程,扩展功能不是修改源代码实现. ioc:控制反转,把对象的创建交给Spring进行配置,比如一个类,在类里面有 ...
- Linux 进程同步和通信
为了同步进程所以需要进程通信 管道(有名:文件形式存在,无名:仅限于父子进程间通信) 消息队列 信号量 共享存储 套接字(可用于不同机器)
- 关于Linux 文件权限的思考
Linux文件系统每个文件分为inode和block,inode中包含一些基本信息(文件名,类型,长度,修改时间,权限等待),并且指向包含文件真实内容的block,而目录是文件的一种,其block的内 ...
- layer is not defined
项目中使用layui中,引入新旧版本出现的一个问题. 使用console.log(layer) 打印出来的,显示使用的版本是1.8.0 但是页面中引入的layui有好几个.就是不使用最新的. /*这里 ...
- oracle中的exists 和 in 用法详解
以前一直不知道exists和in的用法与效率,这次的项目中需要用到,所以自己研究了一下.下面是我举两个例子说明两者之间的效率问题. 前言概述: “exists”和“in”的效率问题,涉及到效率问题也就 ...
- 更换Appsecrect应该要注意的问题
1. 有时候因为需要,有些地方需要填写Appsecrect, 但是大家都知道微信公众平台上这个值 即使你自己是管理员是看不到的,只能重置,但是重置后,一定要记住刷新AccessToken啊,不然就尴尬 ...