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国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...
随机推荐
- MySQL 批量修改某一列的值为另外一个字段的值
mysql> select * from fruit; +----+--------+-------+ | id | name | price | +----+--------+-------+ ...
- php常用方法
在日常开发中,经常我们使用系统方法或者是自己封装的方法进行项目的开发.再此总结一下!!! 一.对于字符串截取 1.使用mbstring扩展 (注意编码的设置) mb_substr($str,2,5, ...
- JDBC+Servlet+JSP的学生案例增删改查
数据库信息传输到页面实现. 先进行学生信息页面展示: 接口IStudentDao public interface IStudentDao { /** * 保存操作 * @param stu 学生对象 ...
- [FreeBuff]Trojan.Miner.gbq挖矿病毒分析报告
Trojan.Miner.gbq挖矿病毒分析报告 https://www.freebuf.com/articles/network/196594.html 竟然还有端口转发... 这哥们.. 江民安全 ...
- python3 自动识图
一.安装依赖库 pip install pytesseract pip install pillow 二.安装识图引擎tesseract-ocr https://pan.baidu.com/s/1Qa ...
- EmpireCMS的使用
1.下载安装empirecms 下载完成后解压将upload目录整体上传到服务器,并更名为empirecms_test 更改目录文件的权限: chmod -R 777 empirecms_test 配 ...
- Java使用RabbitMQ之整合Spring(生产者)
依赖包 <!--RabbitMQ集成spring--> <!-- https://mvnrepository.com/artifact/org.springframework.amq ...
- 四、docker compose
docker compose可以方便我们快捷高效地管理容器的启动.停止以及重启等操作,和批量管理容器,它类似于linux下的shell脚本,基于yaml语法,在该文件里我们可以描述应用的架构,比如用什 ...
- tensorflow中使用指定的GPU及GPU显存 CUDA_VISIBLE_DEVICES
参考: https://blog.csdn.net/jyli2_11/article/details/73331126 https://blog.csdn.net/cfarmerreally/arti ...
- Xamarin 简化的Android密钥库签名
安装 开始使用这个新工具不容易.在Visual Studio 2017(即将推出VS 2015),只需转到工具 - >扩展和更新,并搜索“密钥库”来查找扩展名. 下载后,只需重新启动Visual ...