【NOIP2018】赛道修建【二分】【树形dp】【multiset】【贪心】

传送门

题意:给一棵带边权的树,求MMM条没有公共边的路径的最小长度的最大值。

N≤50000N \leq50000N50000

抛开NOIP不谈,其实这题本身出的很好

显然二分

问题转化成了“最多可以找多少条长度不小于kkk的路径”

递归处理

对于每个结点iii,先统计它的子树剩下的链加上当前边权。

现在我们得到了若干个数,表示以iii为顶的还没用过的链的长度

我们希望用这些数凑出kkk

大于等于kkk的可以直接统计答案

有如下贪心策略:从小到大二分最小的可以匹配的,最后把不能匹配的最长的作为剩下的链传回去

为什么?

首先,很显然尽量匹配小的

如果我们留了一条很长的链不匹配而要传上去,也最多产生111的贡献。而现在直接匹配也会有111的贡献,不配白不配。

为什么从小到大?

如果我们从大到小,或者用一些神奇的顺序,那就是出现大配小的情况。从小到大我们就算不匹配尽量小也能重现之前的状态,尽量小就肯定更优了。

用multiset维护即可。

细节有点多。注意大于等于kkk的必须在开始弹掉,否则可能浪费一个小的。

菊花图可能卡常,可以跑个直径作为二分上限。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <set>
#define MAXN 50005
#define MAXM 100005
using namespace std;
struct edge{int u,v,w;}e[MAXM];
int head[MAXN],nxt[MAXM],cnt;
void addnode(int u,int v,int w)
{e[++cnt]=(edge){u,v,w};nxt[cnt]=head[u];head[u]=cnt;
}
int dp[MAXN];
int count(int u,int f,int k)
{multiset<int> s;int ans=0;for (int i=head[u];i;i=nxt[i])if (e[i].v!=f){ans+=count(e[i].v,u,k);if (dp[e[i].v]+e[i].w>=k) ++ans;else s.insert(dp[e[i].v]+e[i].w);}while (!s.empty()){int mn=*s.begin();multiset<int>::iterator p=s.lower_bound(k-mn);if (p==s.begin()) ++p;if (p==s.end()){dp[u]=max(dp[u],mn);s.erase(s.begin());continue;}++ans;s.erase(p);s.erase(s.begin());}return ans;
}
int dis[MAXN];
void dfs(int u,int f)
{for (int i=head[u];i;i=nxt[i])if (e[i].v!=f){dis[e[i].v]=dis[u]+e[i].w;dfs(e[i].v,u);}
}
int main()
{int n,m;scanf("%d%d",&n,&m);for (int i=1;i<n;i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);addnode(u,v,w);addnode(v,u,w);}dfs(1,0);int mx=0;for (int i=1;i<=n;i++) if (dis[i]>dis[mx]) mx=i;dis[mx]=0;dfs(mx,0);int l=0,r=0,mid;for (int i=1;i<=n;i++) r=max(r,dis[i]);while (l<r){mid=(l+r+1)>>1;memset(dp,0,sizeof(dp));if (count(1,0,mid)>=m) l=mid;else r=mid-1;}printf("%d\n",l);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core 系列之Startup

这篇文章简单记录 ASP.NET Core中 &#xff0c;startup类的一些使用。一.前言在 Startup类中&#xff0c;一般有两个方法&#xff1a;ConfigureServices 方法: 用来配置应用的 service 。 Configure 方法&#xff1a;创建应用的请求处理管道它们都在应用启动时&#xff0c;被AS…

可持久化Splay 学习笔记

可持久化Splay是怎么回事呢&#xff1f;Splay相信大家都很熟悉&#xff0c;但是可持久化Splay是怎么回事呢&#xff0c;下面就让小编带大家一起了解吧。   可持久化Splay&#xff0c;其实就是将Splay持久化一下&#xff0c;大家可能会很惊讶Splay怎么可以持久化呢&#xff1f…

译 | .NET Core 基础架构进化之路(一)

原文&#xff1a;Matt Mitchell翻译&#xff1a;Edi Wang随着 .NET Core 3.0 Preview 6 的推出&#xff0c;我们认为简要了解一下我们基础设施系统的历史以及过去一年左右所做的重大改进会很有用。如果您对构建基础结构感兴趣&#xff0c;或者想要了解我们如何构建与 .NET Core…

【洛谷P4705】玩游戏【二项式定理】【NTT卷积】【生成函数】【分治NTT】【函数求导】【多项式对数】

传送门 题意&#xff1a;给定长度为N,MN,MN,M的序列a,ba,ba,b和ttt&#xff0c;随机选取x∈[1,N],y∈[1,M]x \in[1,N],y\in[1,M]x∈[1,N],y∈[1,M],对于i1,2,...,t,i 1,2,...,t,i1,2,...,t,求(axby)i(a_xb_y)^i(ax​by​)i的期望 N,M,t≤100000N,M,t \leq100000N,M,t≤100000 …

剑指 Offer 27. 二叉树的镜像

思路&#xff1a;递归 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:TreeNode* mirrorTree(TreeNode*…

Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的序列aaa&#xff0c;让你计算 n≤4e5,a≤1e7n\le 4e5,a\le 1e7n≤4e5,a≤1e7 思路&#xff1a; 首先这个式子是n2n^2n2的&#xff0c;显然不能直接算&#xff0c;并且异或没有分配律&…

.NET开发框架(一)-框架介绍与视频演示

本文主要介绍一套基于.NET CORE的SPA高并发、高可用的开发框架.我们暂且称它为&#xff1a;&#xff08;让你懂.NET&#xff09;开发框架。以此为主线&#xff0c;陆续编写教程&#xff0c;讲述如何构建高并发、高可用的框架。&#xff08;欢迎转载与分享&#xff09;它标准化了…

【CF700E】Cool Slogans【后缀自动机】【可持久化线段树合并】【树上倍增】

传送门 题意&#xff1a;给定字符串SSS&#xff0c;求一堆字符串s1,s2,s3,...,sks_1,s_2,s_3,...,s_ks1​,s2​,s3​,...,sk​&#xff0c;满足s1s_1s1​是SSS的子串&#xff0c;且sis_isi​在si−1s_{i-1}si−1​中至少出现两次&#xff0c;最大化kkk ∣S∣≤200000|S| \leq …

P1377 [TJOI2011]树的序 笛卡尔树优化建树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一棵二叉树的生成序列&#xff0c;让你输出一个字典序最小的序列&#xff0c;使其生成的二叉树与原来的二叉树相同。 思路&#xff1a; 首先想到暴力建树&#xff0c;让后输出先序遍历即可&#xff0c…

译 | .NET Core 基础架构进化之路(二)

原文&#xff1a;Matt Mitchell翻译&#xff1a;Edi Wang&#xff08;接上篇 译 | .NET Core 基础架构进化之路&#xff08;一&#xff09;&#xff09;Maestro 及依赖流.NET Core 3.0 基础结构难题的最后一部分就是我们所说的依赖项流。这不是 .NET Core 的唯一概念。除非它们…

【NOI2019】回家路线【无后效性dp状态设计】【斜率优化】

传送门 题意&#xff1a;给定MMM个班车&#xff0c;每个班车pip_ipi​时刻从xix_ixi​发车qiq_iqi​到达yiy_iyi​&#xff0c;等车ttt时间花费代价At2BtCAt^2BtCAt2BtC,在ttt时刻到达花费ttt的代价&#xff0c;求从111到NNN的最小花费。 1≤N≤100000,1≤M≤2000001 \leq N \…

Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个数&#xff0c;每个数的因子个数不超过777个&#xff0c;选出最少的数使其乘积为平方数。 n≤1e5n\le 1e5n≤1e5 思路&#xff1a; 由于因子不超过777个&#xff0c;所以由约数个数(1p1)∗(1p2)∗…

在.Net Core中实现一个WebSocket路由

Net Core中使用WebSocket默认是没有路由系统的&#xff0c;只能通过Request.Path"/xxx"来判断请求&#xff0c;例如&#xff1a;1 2 3 4 5 6 7 8 91011121314151617181920app.Use(async (context, next) >{ if (context.Request.Path "/ws") { …

【CF1189D】Add on a Tree【结论】【构造】

传送门 题意&#xff1a;给一棵NNN个结点的树&#xff0c;构造或判断无法构造若干次操作&#xff0c;每次操作选择两个叶节点将路径上的边加上一定整数权值&#xff0c;使得每条边等于给定权值。权值互不相同且为偶数。 1≤N≤10001 \leq N \leq10001≤N≤1000 结论&#xff…

Codeforces Round #628 (Div. 2) F. Ehab‘s Last Theorem dfs树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你个nnn个点mmm条边的图&#xff0c;可以选择完成以下两个任务中的一个&#xff1a; (1)(1)(1)找出大小恰好为n\sqrt nn​的一个独立集。 (2)(2)(2)找出一个长度≥n\ge \sqrt n≥n​的一个环。 n≤1e5,m≤…

Dapper介绍--Micro-ORM

一&#xff0e;概述目前对于.net的数据访问ORM工具很多&#xff0c;EF和EF Core是一个重量级的框架。最近在搭建新的项目架构&#xff0c;来学习一下轻量级的数据访问ORM工具Dapper。Dapper支持SQL Server&#xff0c;MySQL&#xff0c;Sqlite&#xff0c;SqlCE&#xff0c;Fir…

剑指 Offer 31. 栈的压入、弹出序列

思路&#xff1a;模拟就完事 class Solution { public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> c;int idx0;for(int v:pushed){c.push(v);while(c.size()&&c.top()popped[idx]){c.pop();idx;}…

【CF1189F】Array Beauty【dp】【复杂度玄学优化】

传送门 题意&#xff1a;给一个长度为NNN的序列aaa,从中选出kkk个&#xff0c;定义一个序列的美丽度为最接近的两个数的差的绝对值&#xff0c;求所有方案的美丽度之和模998244353998244353998244353。 N≤1000,ai≤100000N \leq 1000,a_i \leq100000N≤1000,ai​≤100000 显…

Educational Codeforces Round 84 (Rated for Div. 2) D. Infinite Path 构建环 + 思维

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 懒得写了&#xff0c;直接贴图了。 思路&#xff1a; 遇事不决画成图&#xff0c;考虑将iii向p[i]p[i]p[i]连一个边&#xff0c;可以发现每个点入度为111&#xff0c;出度为111&#xff0c;所以画出来是若…

WSL+VSCODE体验UBUNTU环境下的开发

首先安装 WSL&#xff0c;我这里选择的是 ubuntu18.04 这个应用。切换 WSL 的默认用户为 root 用户切换成 root 用户主要是避免后续开发中遇到权限问题比较麻烦&#xff0c;直接默认 root 解决问题。找到ubuntu安装目录&#xff0c;一般在C:\Program Files\WindowsApps\Canonic…