洛谷P1084 树上问题,思维,贪心,二分答案

【同等学力】2005-数学⭐✨ 有r个正方形排成一行,今用红、黄、白、蓝四种颜色给这个r个正方形染色,每个正方形只能染一种颜色,如果要求染红、黄、白色的正方形分别至少出现一个,问有多少种不同的染法?3、(4分)设G是一个有n个结点m条边的连通简单平面图,若n≥3,则m≤3n-6.4、(4分)证明:任何连通简单平面图至少有一个结点的度数不超过5 阅读详情

题意:

HHH国有nnn个城市,用n−1n-1n−1条道路连接着,其中111是首都,发生了疫情,为了使边境城市(叶子结点)不被感染,需要在所有从首都通往边境城市的路上设置至少一个检查站,一个检查站需要一个军队管辖。HHH国有mmm个军队,目前分别驻扎在aia_{i}ai​城市,现在可以调遣军队,他们同时出发,问最快能在什么时候使所有首都通往边境城市的道路上都至少存在一个检查站?军队每个小时行进111个单位的距离

Solution:

如果检查站深度越低,显然他能为更多的道路做出贡献,因此,军队要么被调拨至111的其他儿子处,要么在当前位置到111的链的深度更浅的位置,这样的决策一定是更优的,有点难操作,相互制约因素有点多,我们要使耗时最多的军队耗时最少,不妨二分答案,假设二分时间为xxx,考虑怎么检查是否在xxx时间内达成目的

由于深度越低,贡献越大,所以我们不妨在xxx时间内,一直向上走,由上面的分类,我们可以考虑是否让某只军队iii越过111这个位置,设uuu为111的儿子中,子树包含了aia_{i}ai​的城市

如果xxx时间并不足以让iii到达111,那么他最高能到达哪里,他在这个位置就一定最优

如果xxx时间足以让iii到达111,设到达111位置后还剩下的时间为restrestrest,这样的军队能够被调拨至111的另外的儿子处,同时,它也可以重新返回uuu,管辖他所在的那一颗子树,我们该怎么决策呢?可以这样考虑,我们将所有能够到达111的iii的restrestrest排序,再将所有111到他所有没有被管辖的儿子的距离排序,现在要做的就是用restrestrest跟距离配对。贪心想法自然是小的配对小的,大的配对大的,尽量物尽其用,但此时如果可以返回uuu,并且如果uuu没有被管辖,返回uuu一定是更优的,证明过程如下:

我们的配对顺序如下

bool check()
{
    sort(rest+1,rest+1+n);
    sort(dis+1,dis+1+m);
    for(int i=1,j=1;i<=n;i++)
        if(j<=m&&rest[i]>=dis[j]) j++;
    return j==m+1;
}

显然,我们配对过的jjj一定是从左到右的,所以如果iii的uuu还没有被配对,此时一定出现在已配对完指针的右边,由于disdisdis被排过序,他的disdisdis一定大于等于现在等待匹配的,也就是我们能用目前的rest[i]rest[i]rest[i],来消去一个不会更小的dis[j]dis[j]dis[j],这样一定是更赚的,这是没有iii返回过的情况,同理可以得到,就算有iii返回过,也是更赚的

最后,能否在xxx时间内到达111,只需要看深度即可,并且需要处理每个iii的uuu,需要一步一步往上走,直到父亲为111为止,这一步是可以用倍增优化的,但是需要注意的是,此时是有权树,倍增跳跃的距离不是2i2^i2i。同时,处理完所有不能到达111的军队之后,我们还需要检查子树是否被管辖,所以需要一次dfsdfsdfs,子树uuu被管辖的条件是:uuu有军队,或者uuu的所有儿子都被管辖。

// #include<bits/stdc++.h>
#include<iostream>
#include<ctime>
#include<queue>
#include<complex>
#include<cstdio>
#include<bitset>
#include<stack>
#include<cmath>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;

using ll=long long;
#define int long long
const int N=5e4+5,inf=0x3fffffff;
const long long INF=0x3f3f3f3f3f3f,mod=998244353;

struct way
{
	int to,next,w;
}edge[N<<1];
int cntt,head[N];

void add(int u,int v,int w)
{
	edge[++cntt].to=v;
	edge[cntt].w=w;
	edge[cntt].next=head[u];
	head[u]=cntt;
}

bool has[N];
int n,m,depth[N],a[N],f[N][21];

void dfs(int u,int fa)
{
	f[u][0]=fa;
	for(int i=1;i<=20;i++) f[u][i]=f[f[u][i-1]][i-1];
	for(int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to,w=edge[i].w;
		if(v==fa) continue;
		depth[v]=depth[u]+w;
		dfs(v,u);
	}
}

struct node
{
	int rest,from;
}rt[N];

int now[N],cnt;

int jump(int x,int len)
{
	for(int i=20;i>=0;i--)
		if(f[x][i]&&depth[x]-depth[f[x][i]]<=len) len-=depth[x]-depth[f[x][i]],x=f[x][i];
	return x;
}

void dfs1(int u,int fa)
{
	bool flag=true,son=false;
	for(int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa) continue;
		dfs1(v,u); son=true;
		if(!has[v]) flag=false;
	}
	has[u]=(has[u]||(son&&flag));
}

bool check(vector<pair<int,int>>&tmp)
{
	int j=0;
	for(int i=1;i<=cnt;i++)
	{
		while(j<tmp.size()&&has[tmp[j].first]) j++;
		if(!has[rt[i].from]) has[rt[i].from]=true;
		else if(j<tmp.size()&&rt[i].rest>=tmp[j].second) has[tmp[j++].first]=true;
	}
	while(j<tmp.size()&&has[tmp[j].first]) j++;
	return j==tmp.size();
}

bool check(ll x)
{
	cnt=0;
	for(int i=1;i<=n;i++) has[i]=false;
	for(int i=1;i<=m;i++)
	{ 
		if(depth[a[i]]-1<=x) rt[++cnt]={x-(depth[a[i]]-1),jump(a[i],depth[a[i]]-2),false};
		else has[jump(a[i],x)]=true;
	}
	dfs1(1,0);
	sort(rt+1,rt+1+cnt,[&](const node& x,const node& y){
		return x.rest<y.rest;
	});
	vector<pair<int,int>>tmp;
	for(int i=head[1];i;i=edge[i].next)
		if(!has[edge[i].to]) tmp.push_back({edge[i].to,edge[i].w});
	sort(tmp.begin(),tmp.end(),[&](const pair<int,int>& x,const pair<int,int>& y){
		return x.second<y.second;
	});
	return check(tmp);
}

signed main()
{
	ios::sync_with_stdio(false);
	cin>>n; depth[1]=1;
	for(int i=1;i<n;i++)
	{
		int u,v,w; cin>>u>>v>>w;
		add(u,v,w); add(v,u,w);
	}
	cin>>m;
	for(int i=1;i<=m;i++) cin>>a[i];
	dfs(1,0);
	ll l=1,r=INF,ans=INF;
	while(l<=r)
	{
		int mid=l+r>>1;
		if(check(mid))
		{
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	if(ans==INF) ans=-1;
	cout<<ans;
	return 0;
}
54、生物神经网络建模全解析 本文系统解析了生物神经网络的建模方法,涵盖从单个神经元到神经网络的多个时空尺度。首先介绍神经元层面的生物物理模型(如霍奇金-赫胥黎模型和多隔室模型)与多种简化模型(如菲茨休-纳古莫、莫里斯-勒卡尔、积分发放模型等),并分析其适用场景。随后探讨突触层面的信号传递机制,对比电突触与化学突触在结构、传输速度和方向上的差异,阐述其在神经网络建模中的理论意义。文章旨在为理解神经系统的信息处理机制、构建受生物启发的人工智能模型提供理论基础。 阅读详情

相关推荐

拥有AI助手便能解放双手?——抖音直播脚本的生成

科技改变生活,AI助手帮你完成抖音创作!

Scientist_的博客 2351

【洛谷P1084】疫情控制【二分+倍增+DFS+贪心】

我们只需要记录所有根的儿子当中哪个有空隙(emp结构体),因为显然我们用剩余的军队去补空隙的时候只会去到根的子节点,才用时最小,再往下跑没意义。枚举空隙,匹配军队给他,优先选本身就在那棵子树上的最小的那个点看能不能到,如果不能就暴力枚举军队看看哪个可以,只要有一个空隙每个军队都没法不上,就判断不成功。枚举每一个军队,让ta尽量往根节点跳,不能跳到根节点,这个跟LCA跳是一样的,同时记录跳的过程中花费的代价,如果最后是有能力跳到根节点的就记录成“剩余军队”,否则直接在原地驻守。“让军队向上移动”的“.....

ssllyr 534

电蚊拍为什么能秒杀蚊子?深入解析两种四倍压整流电路设计差异

本文深入解析电蚊拍秒杀蚊子的核心原理——四倍压整流电路设计,对比对称式与级联式两种方案的性能差异。通过详细电路分析、实测数据对比和选型建议,揭示高压电路设计的关键技术要点,为电子爱好者和工程师提供实用参考。

rust6ferris的博客 749

洛谷 P1084

很好的一道思维题。 我最开始的思路是判断这个题目是由初始状态以最小的代价和转换为合理的状态。这显然理解错了,因为题目说可以同时移动ORZ。。。 然后弄清楚题意后显然是一个二分。 贪心性质:越往上走越好。 走到1节点的儿子节点的时候如果(该儿子节点的所有点的最小剩余距离)大于儿子节点距离根的距离的2倍的话,那么这个点就可以继续向上走。(这点我没想到啊。。。)我最开始的做法就是剩一个最小的,其...

ehdhg13455的博客 307

【rotors】多旋翼无人机仿真(五)——多无人机仿真

如何创建多个无人机仿真

caiqidong321的博客 2392

基于STM32的家用新风系统智能控制器 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了家用新风系统智能控制器的全功能开发,覆盖多传感器数据采集、双模式控制、PID调速、异常报警、掉电记忆等核心功能,全程采用保姆式无跳步教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 463

洛谷:P1084 [NOIP2012 提高组] 疫情控制

【代码】洛谷:P1084 [NOIP2012 提高组] 疫情控制。

学生党,喜欢编程(C++)玩暗区。学业重,经常拖更请谅解 675

解决uc浏览器劫持video标签问题

解决uc视频悬浮播放 ,video标签被浏览器劫持 ,vide0适配

smile_y_y的博客 3449

洛谷 P1084 疫情控制(二分答案 + 树上倍增 + 思维贪心)

答案具有单调性:如果 t 时刻能完成检查点建立,比 t 大的时刻一定行,因此答案具有单调性(这题正是要求所有军队的移动时间的最大值,即最大值最小化问题) 如果需要花时间来移动军队,最优的做法是所有军队都往上移。既然如此,可以二分时间,在这个时间内尽可能的把所有军队往上移,但不要移到根节点。 考虑如何check:若军队不能移动到根结点,那这些军队肯定无法再移动,直接就地建立检查点,此时用dfs搜...

qq_41997978的博客 862

(第七章)FAST开发方法

摘要: FAST是一种轻量级、业务驱动的系统分析与开发框架,适用于中小型项目,强调快速交付和组件化开发。其核心包括8个阶段:范围定义、问题分析、需求分析、逻辑设计、决策分析、物理设计、构造测试和安装发布。特点为结构化、用户参与、迭代渐进,适合需求明确且需快速交付的项目。与RUP(重量级)、敏捷(极轻量)相比,FAST更侧重业务分析和模块化开发。软考中可通过口诀“范围问题求逻辑,决策物理构发布”记忆阶段,并掌握五大开发方法(瀑布、原型、FAST、RUP、敏捷)的核心区别及适用场景。

echo的博客 915

五步通关!宝塔Linux部署ASP.NET Core的魔法秘籍大公开!

摘要: 本文提供ASP.NET Core应用五步部署攻略,涵盖从环境配置到线上运行的完整流程: 1️⃣ 环境准备:安装宝塔面板、ASP.NET Core运行时及开放端口; 2️⃣ 应用发布:通过dotnet publish生成独立部署包并上传服务器; 3️⃣ Nginx配置:设置反向代理将域名请求转发至应用端口; 4️⃣ 进程守护:使用Supervisor确保应用持续运行; 5️⃣ HTTPS加密:通过宝塔快速申请SSL证书并解决验证路径冲突。 关键点: 强调权限设置(755)、端口开放及反向代理细节; 提

java专栏 969

洛谷P2680 树上路径,差分,二分答案

树上路径,二分答案

stdforces的博客 302

前端build工程的时候 出现 `build.rollupOptions.external 的解决方法

看到这个Bug,理性分析: 遇到 Rollup failed to resolve import “@vue/devtools-api” 错误可能是由于 Pinia 使用了 @vue/devtools-api 模块,而 Vite 的 Rollup 插件无法解析这个模块 ps:但是我前一秒还可以,加了个别代码,突然不行,我是不相信的 = - =

码农研究僧的博客 3055

洛谷【图论2-1】基础树上问题做题总结

原题单连接:【图论2-1】基础树上问题 这两天写了一下洛谷基础树上题单,小小的做一个总结,不然又忘了,收获还是有的,还有两题没写,一题是原来再牛客看题解做过了,还有一题(P5666 树的重心)感觉有点难,后面再补,感觉自己做的题型还是太少了,慢慢来吧。 P5836 [USACO19DEC]Milk Visits S 这道题应该是最简单的一题吧,把两种牛所在的节点赋予0或者1权值,统计路径和然后与询...

weixin_45677913的博客 641

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

洛谷Luogu-2759 奇怪的函数 (二分答案) HQG_AC的博客

看着很像快速幂,但快速幂肯定要超时。于是乎。。这种题目本来就很水(标签是提高+/省选,但实际也就普及),而且又是最值问题,当然,x也那么的大,故:用二分答案解决16行代码二分可行x,用求位数公式 len=(x*logx)/log(10)+1求出位数,之后与len比较,小于则枚举右一半,否则左一半输出是l建议使用long long ,我也不知道开int会不会爆,于是开了long long详见代码:#...

Hacheylight 375

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

洛谷P1084疫情控制题解--zhengjun

题面传送门 我去我TM没有去掉freopen调了一下午⋯\cdots⋯ 思路 因为如果第iii分钟可以控制住疫情,那么第i+1i+1i+1以及之后的都是可以的,所以,就可以二分了。 然后就是checkcheckcheck函数如何写,有一个显而易见,就是每一个军队都要尽量靠近根节点,这样才会拦掉更多的点,所以,就要把每个军队向上提,如果可以到达根节点,就先放在一边,然后再处理,然后,因为到了根节点了...

A_zjzj的博客 713

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

洛谷 P1084 疫情控制

题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点。 H 国的首都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境城市的每一条路径上都至少有一个检查点,边境城市也可以建立检查点。但特别要注意的是,首都是不能建立检查点的。 现在

苦鬼·。 3009

洛谷_1084 疫情控制(贪心+倍增+二分)

疫情控制 题目链接:https://www.luogu.com.cn/problem/P1084 题解: 对答案进行二分,然后check在时限内,能否满足题目条件。(若军队数目小于1号节点的子节点数,则无解) check:显然在规定时间内,军队的移动越靠近根节点更好。所以可以先求出时限内,每支军队能移动到的最靠近根节点的位置,可以利用倍增快速计算。 将所有能移动至根节点的军队标记为未驻扎状态,单独记录其到根节点已花费的时间,以及来自根节点的哪个子树。 DFS判断根节点每个子节点所在子树是否满足要求,若不满足

sigh_的博客 696

洛谷 P1084 疫情控制 —— 二分+码力

题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

aodan5477的博客 535

洛谷P1084(疫情控制)

洛谷P1084   这一题是我和洛谷的结缘题,是在做了这题后才开始迈入洛谷的ac路,然而我都大二了,还是菜鸡一个   这题是一个二分法去做,因为题目的解是一个线性的,好像求一根直线与x轴的交点一样,非常的巧妙。我一开始是不会做的,是看了大佬们的题解后,摸索了3天才理解了个大概   感觉没啥好说的,直接上代码 #include<iostream> #include<cstdio> #include<cstring> #include<stack> #includ

ly3098268698的博客 1064

洛谷P1084疫情控制

洛谷P1084疫情控制 考点:树上倍增,贪心,二分答案,链式向前星。 之前见过一个类似的用贪心和枚举答案的题,但没太在意。这道题想到了用贪心想要模拟军队前进,然后删去重复无用的军队,但后来发现是多叉树这样就不能做了 真正的解法:树上倍增预处理,二分枚举答案找到最小的答案(二分枚举需要题目对于但答案有单调性,所有大于或小于的正确答案的值也可以使题目通过,且答案有最小单位,比如这道题一定是整数)然后是用贪心写出检查答案正确的函数。题中的细节很多,需要一步一步的拆解问题。 #include<iostream

shi_zi_183的博客 347

洛谷P1084 疫情控制(贪心+倍增)

这个题以前写过一遍,现在再来写,感觉以前感觉特别不好写的细节现在好些多了,还是有进步吧。 这个题的核心思想就是贪心+二分。因为要求最小时间,直接来求问题将会变得十分麻烦,但是如果转换为二分答案来判断可行性,问题就会简化许多。 至于贪心的话,很容易发现每个点尽量往上面跳是最优的,这里向上跳的话我们用倍增来搞就是了。但题目中有个限制条件就是:根结点不能驻扎军队!!。那么我们就可以先让所有点尽...

dft539533的博客 284

洛谷 P1084 [NOIP2012 D2T3] 疫情控制

贪心+二分+搜索

依然一笑作春温。 2180

洛谷1084/codevs1218 二分+倍增+贪心,分步讲解

题目分析我们要明确我们做什么,一步一步慢慢来,否则会被这题逼疯。1.预处理倍增我们会发现,离根节点越近的节点,控制的节点更多。所以由贪心的思想,所有的军队都要尽可能地往根节点走。 ”往上提“类型问题一般使用倍增优化。——xzy神犇(见传送门:xzy的博客) 好大的,那么我们可以dfs一遍,将倍增要用的一些值都处理好(见代码)2.二分答案军队可以同时移动,说明我们要控制传染病的时间是军队移动到位时

litble的成(tui)长(fei)史 1635

【NOIP2012】洛谷1084 疫情控制

二分答案+树上倍增+贪心

YHaX的博客 1016

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 189
上一篇: 2020icpc上海E 全排列计数
下一篇: hdu 5947 数论
stdforces
博客等级 码龄4年 9粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值