JZOJ 4896. 【NOIP2016提高A组集训第16场11.15】兔子
题目
在一片草原上有 \(N\) 个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝。更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连。换句话讲,这些兔子窝之前的路径构成一张 \(N\) 个点、\(M\) 条边的无向连通图,而度数大于2的点至多有1个。
兔子们决定把其中 \(K\) 个兔子窝扩建成临时避难所。当危险来临时,每只兔子均会同时前往距离它最近的避难所躲避,路程中花费的时间在数值上等于经过的路径条数。为了在最短的时间内让所有兔子脱离危险,请你安排一种建造避难所的方式,使最后一只到达避难所的兔子所花费的时间尽量少。
分析
显然二分答案,然后判断能不能成功
首先考虑一条链,它需要的最少的避难所数量是 \(\lceil \frac{len}{2 \times mid + 1} \rceil\)
就是能不放就不放
环呢?
然后发现只有一个度数大于 \(2\) 的点
记为 \(rt\)
它必然是环上的点
如果把它删了,就只剩下一堆链
于是我们枚举一个可以覆盖 \(rt\) 的,把这个点能覆盖的所有点都删了
图只剩下一堆链
再统计每条链的长度 \(len\),用上面的贪心办法算
算完后如果结果小于等于 \(k\),那就成功了
于是就是 \(O(N^2 \log N)\) 的
\(Code\)
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 1005 , M = 1505;
int n , m , k , tot , rt , h[N] , vis[N] , deg[N] , X[N];
struct edge{
	int to , nxt;
}e[M * 2];
inline void add(int x , int y){e[++tot] = edge{y , h[x]} , h[x] = tot;}
void choose(int x , int d , int mid)
{
	if (d <= mid) X[++X[0]] = x;
	else return;
	vis[x] = 1;
	for(register int i = h[x]; i; i = e[i].nxt)
	{
		int v = e[i].to;
		if (!vis[v]) choose(v , d + 1 , mid);
	}
}
void del(int x , int d , int mid)
{
	if (d > mid) return;
	vis[x] = 1;
	for(register int i = h[x]; i; i = e[i].nxt)
	{
		int v = e[i].to;
		if (!vis[v]) del(v , d + 1 , mid);
	}
}
int Get(int x)
{
	int res = 1; vis[x] = 1;
	for(register int i = h[x]; i; i = e[i].nxt)
	{
		int v = e[i].to;
		if (!vis[v]) res += Get(v);
	}
	return res;
}
int check(int mid)
{
	if (rt == 0) return (int)ceil(1.0 * n / (2 * mid + 1));
	memset(vis , 0 , sizeof vis);
	int num = 0; X[0] = 0 , choose(rt , 0 , mid);
	for(register int i = 1; i <= X[0]; i++)
	{
		memset(vis , 0 , sizeof vis);
		del(X[i] , 0 , mid) , num = 1;
		for(register int i = 1; i <= n; i++)
		if (!vis[i]) num += (int)ceil(1.0 * Get(i) / (2 * mid + 1));
		if (num <= k) return 1;
	}
	return 0;
}
int main()
{
	freopen("rabbit.in" , "r" , stdin);
	freopen("rabbit.out" , "w" , stdout);
	scanf("%d%d%d" , &n ,&m , &k);
	int x , y;
	for(register int i = 1; i <= m; i++)
		scanf("%d%d" , &x , &y) , add(x , y) , add(y , x) , deg[x]++ , deg[y]++;
	for(register int i = 1; i <= n; i++)
	if (deg[i] >= 3){rt = i; break;}
	if (n == 1){printf("0"); return 0;}
	int l = 1 , r = n , mid , res;
	while (l <= r)
	{
		mid = (l + r) >> 1;
		if (check(mid)) res = mid , r = mid - 1;
		else l = mid + 1;
	}
	printf("%d" , res);
}
												
											JZOJ 4896. 【NOIP2016提高A组集训第16场11.15】兔子的更多相关文章
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
		
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
 - JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
		
JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...
 - 【JZOJ4895】【NOIP2016提高A组集训第16场11.15】三部曲
		
=v= 因为外来的入侵,国王决定在某些城市加派士兵.所有城市初始士兵数量为0.当城市 被加派了k名士兵时.城市i的所有子城市需要被加派k+1名士兵.这些子城市的所有子城市需要被加派k+2名士兵.以此类 ...
 - 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线
		
题目描述 数据范围 解法 考虑逐次加入每一条直线. 对于当前已加入的直线集合L,现在要新加入一条直线l. 那么它产生的贡献,与平行线有关. 对于任意三条直线,如果其中任意两条平行,那么将不做贡献. 所 ...
 - 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子
		
题目描述 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子窝之 ...
 - 【NOIP2016提高A组集训第4场11.1】平衡的子集
		
题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
 - 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
		
好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...
 - 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
		
题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...
 - 【NOIP2016提高A组集训第14场11.12】随机游走
		
题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...
 - 【NOIP2016提高A组集训第13场11.11】最大匹配
		
题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...
 
随机推荐
- 「Goravel 上新」用户授权模块,让你简单的对非法用户 Say No!
			
首先,让我们定义一个规则:用户只能访问自己创建的文章. facades.Gate.Define("update-post", func(ctx context.Context, a ...
 - 数电第五周周结_by_yc
			
数电第五周周结_by_yc 基本要点: 组合逻辑电路的行为特点.经典组合逻辑电路的设计.PPA优化 组合逻辑电路设计要点: ①敏感变量列表应包含所有会影响输出的控制量: ②条件语句的完全描述, ...
 - JavaScript入门④-万物皆对象:Object
			
01.Object对象 Object 是 JavaScript 的一种 数据类型,它用于存储各种键值集合和更复杂的实体,是一组数据和功能的集合.JS中几乎所有对象都是继承自Object,Array.R ...
 - 【kafka】JDBC connector进行表数据增量同步过程中的源表与目标表时间不一致问题解决
			
〇.参考资料 一.现象 1.Oracle源表数据 2.PG同步后的表数据 3.现象 时间不一致,差了8个小时 4.查看对应的connector信息 (1)source { "connecto ...
 - Day37:正则表达式详解
			
正则表达式 1.1 概述 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性. 比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校验我们输入的账号格式是否正确 ...
 - SpringBoot基础学习笔记
			
Springboot框架: springboot官网参考 Sringboot是整合spring技术栈的一站式框架,其简化配置,实现了自动化配置 Springboot基础结构: 1.pom.xml文件: ...
 - day10-功能实现09
			
家居网购项目实现09 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 21.功能20-修改购物车 21.1需求分析/图解 进入购 ...
 - vue3+ts 全局事件总线mitt
			
Mitt 在vue3中 $ on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了.然而我们习惯了使用EventBus,对于这种情况 ...
 - 2021 & 2022年终回顾:山河无恙,烟火寻常
			
前言 又到了一年一度年终回顾的时候了,回想起去年年底圣诞节的时候由于忙着参加黑客松大赛,一下子就进入了新的一年,失去了年终回顾的动力,所以今年提前两个月开始进行回顾,这样的话今年最后一天就可以顺利发文 ...
 - ArcObjects SDK开发 一些可直接调用的对话框
			
在ArcMap中,一些对话框是很复杂的,例如设置点线面样式的对话框,选择空间参考的对话框等,但这些对话框有些在ArcObjects SDK中是可以直接调用的. 1.空间参考选择设置对话框 弹出空间参考 ...