博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P5021 赛道修建 (NOIP2018)
阅读量:5307 次
发布时间:2019-06-14

本文共 1841 字,大约阅读时间需要 6 分钟。

考场上把暴力都打满了,结果文件输入输出写错了....

当时时间很充裕,如果认真想想正解是可以想出来的..

问你 长度最小的赛道长度的最大值

显然二分答案

考虑如何判断是否可行

显然对于一个节点,它最多只能向父亲传一条路径长度

那么其它路径的合并只能在子树间进行

贪心一波,如果一段路径在子树就可以合并出合法长度

那么直接合并一定是不会比传给父亲再考虑合并更劣的

子树都合并完后,剩下的肯定传最长的长度给父亲

考虑在子树内如何贪心地进行最优合并

显然最小的边去找最小的能使它合法的边合并

(注意不是最大的边去找最小的能使它合法的边合并)

那么用一个multiset存一下当前节点的各个边长

然后就按前面的方法一个个合并就好了

注意和并时的一些细节和二分的上界,(因为multiset常数大,所以要把上界设为总长除赛道数)

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N=1e5+7,INF=2e9+7;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f;}int fir[N],from[N<<1],to[N<<1],val[N<<1],cntt;inline void add(int &a,int &b,int &c){ from[++cntt]=fir[a]; fir[a]=cntt; to[cntt]=b; val[cntt]=c;}int n,m,mid,cnt;int f[N];multiset
S;multiset
::iterator it,itt,pit;void dfs(int x,int fa){ for(int i=fir[x];i;i=from[i]) { int &v=to[i]; if(fa==v) continue; dfs(v,x);//先把每个节点遍历一波再从后往前更新会比较方便(不然要开一堆set) } S.clear();//记得清空 for(int i=fir[x];i;i=from[i]) { int &v=to[i]; if(fa==v) continue; if(f[v]+val[i]>=mid) cnt++;//只考虑小于mid的长度的合并(大于的不用合并都有贡献) else S.insert(f[v]+val[i]);//注意把儿子传的边长加上父子间的边长 } it=S.begin(); while(it!=S.end()) { itt=S.lower_bound(mid-(*it)); if(itt==it) itt++;//注意细节 if(itt!=S.end()) cnt++,S.erase(itt),pit=it,it++,S.erase(pit); else it++; } f[x]=0;/*记得先清空f*/ it=S.begin(); if(S.end()!=it) it=S.end(),it--,f[x]=*it;//注意必须有边传才更新f}inline int judge(){ cnt=0; dfs(1,1); return cnt>=m;}int main(){ int a,b,c,s=0; n=read(); m=read(); for(int i=1;i
1) { mid=L+R>>1; if(judge()) L=mid; else R=mid; } mid=R; printf("%d",judge() ? R : L); return 0;}

 

转载于:https://www.cnblogs.com/LLTYYC/p/10073640.html

你可能感兴趣的文章
一台电脑如何管理多个ssh key
查看>>
C# 定时关机小程序
查看>>
【blog】推荐一个博客系统后台管理模板 - pinghsu
查看>>
说说MySQL索引
查看>>
zabbix发送邮件脚本
查看>>
生成随机的数字和字母组合
查看>>
File类
查看>>
java学习-1
查看>>
unigui的菜单树补习【2】treeview
查看>>
Qt 获取屏幕信息
查看>>
dubbo注册服务IP解析异常及IP解析源码分析
查看>>
java_位运算符
查看>>
java_基础语法之while语句
查看>>
个人经验 - Android的RelativeLayout布局的layout_height属性设置为wrap_content时的坑
查看>>
最长子序列
查看>>
SQL分组查询每组前几条数据
查看>>
01章 面向对象开发方法概述
查看>>
命令行调用Lame批量压缩MP3
查看>>
iis7配置网站容易出现的问题(转)
查看>>
如何成为一名优秀的程序员?
查看>>