luogu5021 [NOIp2018]赛道修建 (二分答案+dp(贪心?))
首先二分一下答案,就变成了找长度>=m的 不相交的路径的个数
考虑到在一个子树中,只有一个点能出这个子树去和别的点搞
所以我这个子树里尽量自我满足是不会有坏处的
而且要在自我满足数最大的条件下,剩下一个尽量大的去把他搞出去
具体来说,我们设f[x]是x的子树中的满足条件的最大路径数,g[x]是在f[x]最大的情况下能剩下来的x的子树中到x的最大的路径长度
我们假设y们是x的孩子们,那我们拿着g[y]+edge[x][y],又可以拼出好多路径
首先如果他已经>=m了,那就直接f[x]++
然后我把剩下的排个序,开一个l一个r,对着扫,我找能满足它的最小的那个,然后把他俩踢掉
但踢完以后我还要把r往右搞,因为有可能再把它往左搞的话他就不能满足新的l+1了
所以需要用一个双向链表来做
但还有一个问题,我不能在l>=r的时候就直接跳出,考虑1 2 4 5,我第一次做完以后l指在4 r也指在4 所以我要让r再跳一跳,直到他跳出去了在结束
还是看代码吧...
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=5e4+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){
if(c=='-') neg=-;
c=getchar();
}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int eg[maxn*][],egh[maxn],ect;
int N,M,f[maxn],g[maxn],son[maxn],sh;
int nxt[maxn],pre[maxn]; inline void adeg(int a,int b,int c){
eg[++ect][]=b,eg[ect][]=c,eg[ect][]=egh[a],egh[a]=ect;
} inline bool cmp(int a,int b){
return g[a]<g[b];
} void dfs(int x,int fa,int k){
f[x]=g[x]=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa) continue;
dfs(b,x,k);
}sh=;
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==fa) continue;
son[++sh]=b;
g[b]+=eg[i][];f[x]+=f[b];
}
sort(son+,son+sh+,cmp);
int l=,r=sh;
pre[]=;nxt[]=,pre[sh+]=sh;nxt[sh+]=;
for(int i=;i<=sh;i++){
pre[i]=i-;nxt[i]=i+;
}
for(;r;r=pre[r]){
if(g[son[r]]<k) break;
f[x]++;
pre[nxt[r]]=pre[r],nxt[pre[r]]=nxt[r];
}
for(;l<=sh;l=nxt[l]){
for(;l<pre[r]&&g[son[l]]+g[son[pre[r]]]>=k;r=pre[r]);
if(l<r&&r<=sh&&g[son[l]]+g[son[r]]>=k){
f[x]++;
pre[nxt[r]]=pre[r],nxt[pre[r]]=nxt[r];
pre[nxt[l]]=pre[l],nxt[pre[l]]=nxt[l];
r=nxt[r];
}
while(nxt[l]<=sh&&r<=nxt[l]) r=nxt[r];
}
if(pre[sh+]) g[x]=g[son[pre[sh+]]];
}
inline bool judge(int k){
dfs(,,k);
return f[]>=M;
} int main(){
// freopen("track.in","r",stdin);
// freopen("track.out","w",stdout);
int i,j,k;
N=rd(),M=rd();
int l=,r=,ans=;
for(i=;i<N;i++){
int a=rd(),b=rd(),c=rd();
r+=c;
adeg(a,b,c);adeg(b,a,c);
}
while(l<=r){
int m=l+r>>;
if(judge(m)) l=m+,ans=m;
else r=m-;
}
printf("%d\n",ans); return ;
}
luogu5021 [NOIp2018]赛道修建 (二分答案+dp(贪心?))的更多相关文章
- Luogu5021 [NOIP2018]赛道修建
Luogu5021 [NOIP2018]赛道修建 一棵大小为 \(n\) 的树,边带权.选 \(m\) 条链使得长度和最小的链最大. \(m<n\leq5\times10^4\) 贪心,二分答案 ...
- 竞赛题解 - NOIP2018 赛道修建
\(\mathcal {NOIP2018}\) 赛道修建 - 竞赛题解 额--考试的时候大概猜到正解,但是时间不够了,不敢写,就写了骗分QwQ 现在把坑填好了~ 题目 (Copy from 洛谷) 题 ...
- 【LG5021】[NOIP2018]赛道修建
[LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列
BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...
- 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...
- 【noip2018】【luogu5021】赛道修建
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...
- BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
题目大意:给定一棵树,有一些点是关键点,要求选择不超过mm个点.使得全部关键点到近期的选择的点距离最大值最小 二分答案,问题转化为: 给定一棵树,有一些点是关键点,要求选择最少的点使得每一个关键点到选 ...
- NOIP2012疫情控制(二分答案+倍增+贪心)
Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...
随机推荐
- VS如何在调试时进入到dll文件
背景: 项目A:用C#写的一个类库文件 项目B:引用项目A的dll文件,完成编码,也是C#编写的. 需求:怎么能在调试的时候,调试断点能够从项目B中进入项目A中的代码. 解决办法就是: 假设,项 ...
- React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例)
React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例) TextInput组件介绍 TextInput是一个允许用户在应用中通过键盘输入文本的基本组 ...
- 【翻译】asp.net core中使用FluentValidation来进行模型验证
asp.net core中使用FluentValidation FluentValidation 可以集成到asp.net core中.一旦启用,MVC会在通过模型绑定将参数传入控制器的方法上时使用F ...
- 快速理解Git结构
git pull:拉取远程服务器最新代码到本地(会自动merge) git add:将本地代码添加到暂存区 git commit:将暂存区的所有内容提交到当前分支(git会自动为我们创建第一个分支 ...
- windows浏览器访问虚拟机开的rabbitmq服务,无法访问
根据这个博主的建议 https://blog.csdn.net/csdnliuxin123524/article/details/78207427 换了一个浏览器上火狐浏览器输入“localhost: ...
- python爬虫之requests的基本使用
简介 Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作. 一 ...
- log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration status="info ...
- Python给照片换底色(蓝底换红底)
环境要求 Python3 numpy函数库 opencv库 安装 下载适应版本的numpy函数库,我电脑是WIN10 64位,安装的函数库是 numpy-1.13.1+mkl-cp36-cp36m-w ...
- java 中 的 字节流!
package cn.zhouzhou; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- draknet网络配置参数
https://blog.csdn.net/hrsstudy/article/details/65447947?utm_source=itdadao&utm_medium=referral [ ...