首页 > 其他分享 >【动态规划】【贪心】 [POI2011] DYN-Dynamite

【动态规划】【贪心】 [POI2011] DYN-Dynamite

时间:2023-11-28 09:15:16浏览次数:28  
标签:cnt int POI2011 mid leq DYN Dynamite inf 关键点

这俩东西是怎么结合到一起的?

题目描述

给一棵树,树上有一些关键节点,要求你选 \(m\) 个点,第 \(i\) 个关键节点到这些点中每个点距离的最小值记为 \(dis_i\),记这全部 \(dis\) 的最大值为 \(K\),现在要使 \(K\) 最小,求这个 \(K\)。

\(1 \leq n,m \leq 3 \times 10^5\) 。

算法描述

让最大值最小,二分答案判断可行性。假设现在 \(dis\) 的最大值为 \(mid\),相当于要所有的关键点到最近的选择点距离都小于等于 \(mid\) ,我们发现一棵子树内的关键点,要么已经在子树中解决,要么需要一条链从外面进来覆盖它。所以我们考虑记 \(f_x\) 为 \(x\) 子树中没有被覆盖关键点到 \(x\) 的最大距离。

但是,存在一种从子树中心选的点覆盖这个 \(f_x\) 的情况,所以我们再考虑设 \(g_x\) 为 \(x\) 子树中选择的点到 \(x\) 的最小距离。

\[f_x = \max_{son} f_{son} + 1 \]

\[g_x = \min_{son} g_{son} + 1 \]

我们考虑几种需要修改 \(f,g\) 的情况:

  1. \(f_x = mid\) ,这时如果再拖延就没有办法覆盖到这个距离为 \(mid\) 的点了,所以 \(f_x = -inf,g_x = 0,cnt++\) ,在 \(x\) 处设关键点。

  2. \(f_x + g_x \leq mid\) ,这时可以用子树中的 \(g_x\) 直接覆盖 \(f_x\) ,所以 \(f_x = -inf\) 。

  3. \(g_x > mid,d_x = 1\) ,这个点是关键点,且无法被子树中的点覆盖,所以需要记录这个关键点为 “未覆盖的点”,\(f_x = \max(f_x,0)\) 。

然后二分答案时判断 \(cnt \leq m\) 即可。

时间复杂度 \(\Theta(n \log n)\) 。

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 5,inf = 0x3f3f3f3f;
int f[N],g[N],n,m,cnt = 0,mid,d[N];
vector <int> G[N];
inline void dp(int x,int last)
{
	f[x] = -inf; g[x] = inf;
	for(auto to : G[x])
	{
		if(to == last) continue;
		dp(to,x);
		f[x] = max(f[x],f[to] + 1);
		g[x] = min(g[x],g[to] + 1);
	}
	if(f[x] + g[x] <= mid) f[x] = -inf;
	if(g[x] > mid && d[x] == 1) f[x] = max(f[x],0);
	if(f[x] == mid) ++cnt,f[x] = -inf,g[x] = 0;
}
inline bool check() 
{
	cnt = 0;
	dp(1,0);
	if(f[1] >= 0) cnt++;
	return cnt <= m;
}
int main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i = 1;i <= n;i++) cin>>d[i];
	for(int i = 1,x,y;i <= n - 1;i++)
	{
		cin>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	int l = 0,r = n;
	while(l < r)
	{
		mid = (l + r) >> 1;
		if(check()) r = mid;
		else l = mid + 1;
	}
	cout<<l;
	return 0;
}

标签:cnt,int,POI2011,mid,leq,DYN,Dynamite,inf,关键点
From: https://www.cnblogs.com/TheLastCandy/p/17861048.html

相关文章

  • Could not load dynamic library 'libnvinfer.so.7' 解决方法
    1.首先安装TensorRTpipinstalltensorrt2.找到tensorrt_libs目录,一般在~/.local/lib/python3.10/site-packages/tensorrt_libs/。目录下可以看到libnvinfer.so.8等文件注:有些教程说的是tensorrt目录,但是我在这个目录下面没找到文件3.创建symbollinks,这样TensorFlow才能找到......
  • Solving 0/1 knapsack problem with dynamic programming (英语课汇报)
    Solving0/1knapsackproblemwithdynamicprogrammingIntroduction0/1knapsackproblemsAlongtimeago,anexplorerwenttoanislandwherethereweretreasures,buthisknapsackcouldonlyholdamaximumweightof\(W\).Eachtreasurehaditscorresp......
  • 更开放、更真实——DYNA4虚拟车辆仿真之R8发布
    2023年,中国电动汽车的发展步入白热化。“车”的概念已然不只是车,它被赋予了更多的期待,如“移动的家,幸福的家”、“未来出行探索者”、“突破科技,启迪未来”、“行无界,智千里”等……可见汽车的智能化和舒适化将是未来发展的主旋律,越来越多的功能将需要工程师去开发和验证。 “......
  • Dynamic CRM 组织服务对Word模版生成PDF文件
    目的:解决用户手动下载word模版再上传问题解决方案:组织服务直接对指定的word模版文件生成PDF文件流1.word模版必须上传到系统文档模版后:设置->模版->文档模版 2.组织调用“ExportpdfDocument”,返回PDF文件字节信息。另外实体信息需要把“注释”勾选上,否则执行代码会报错,如下:......
  • es定制 dynamic mapping template(type)
    定制dynamicmappingtemplate(type)PUT/my_index{"mappings":{"my_type":{"dynamic_templates":[{"en":{"match":"*_en","match_mapping_type":"string","mapping&quo......
  • C# 22H2之后的windows版本使用SetDynamicTimeZoneInformation设置时区失败处理
    使用SetDynamicTimeZoneInformation设置时区返回false,设置失败。使用PowerShell设置Set-TimeZone成功。///<summary>///设置本地时区///参数取值"ChinaStandardTime",即可设置为中国时区///</summary>///<paramname="timeZoneId"></param>///<retur......
  • asp.net core api 3.1 dynamic 入参转json对象
    比如接口publicobjectGetList(dynamicobj){//varjElement=(JsonElement)obj;//使用system.text.json处理varstr=obj.GetRawText(); if(val!=JsonValueKind.Undefined&&val!=JsonValueKind.Null)           {if(obj.valueKind==JsonValueKind.Array)......
  • implement a parallel batch processing in X++ of Dynamics 365 F&O
    OneofthepowerfulfeaturesofDynamics365FinanceandOperationsisaBatchframework.Inthispost,Iexplainhowyoucanconvertyourexistingbatchjobtomulti-threadedtoincreaseitsperformance.InitialexampleLet'sconsiderthefollowing......
  • Dynamic Programming
    目录热身198.打家劫舍62.不同路径63.不同路径II213.打家劫舍II337.打家劫舍III参考:https://cloud.tencent.com/developer/article/1692068热身斐波那契数列递归求解自顶向下,存在大量的重复计算动态规划保存中间状态,利用保存的历史状态求解问题,减少了重复计算,空间......
  • P3513 [POI2011] KON-Conspiracy
    题目描述:Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动。国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是后勤组织在未被占领的领土上运转。但是这里出现了一个问题:后勤组织里的任意两人都必须是熟人,以促进合作......