题解—P3000 [USACO10DEC]Cow Calisthenics G
做这题之前最好学会 “树形 \(dp\) 求树的直径”这一前缀知识(虽然我会但是我还是没想出来)
几乎想到要求直径这道题也没什么问题了(这不是废话吗,为什么题面里给了“直径”二字我硬是没往直径那想)
solution
首先不难发现,这是一道树上的 Monthly Expense S ,需要二分答案是显然的,并且还要利用它是一棵树的优势。
证明二分可行性最简单的办法就是看指针移动后候选集合是否存在包含关系,若存在,则必定有单调性。
然后我们现在的主要问题是如何 \(check\)
类比求直径,我们记录 \(d[x]\) 作为从 \(x\) 的子节点到达 \(x\) 的最长路径。
然后正常求直径,唯一的问题就是如果我们遇到“如果加上这个儿子就超过直径限制”的时候,我们就不得不断一条边还满足要求了。
这里贪心地断掉最长的边是显然的,因为当前的直径越短,之后的空间就越大。
没必要排序,只需要对求直径稍微改造即可。
code
(放着么丑的代码真是对不起大家的眼睛啦)
#include <cstring>
#include <algorithm>
#include <cstdio>
#define mp make_pair
#define R register int
#define int long
#define printf Ruusupuu = printf
int Ruusupuu ;
using namespace std ;
typedef long long L ;
typedef long double D ;
typedef unsigned long long G ;
typedef pair< int , int > PI ;
const int N = 2e5 + 10 ;
inline int read(){
int w = 0 ; bool fg = 0 ; char ch = getchar() ;
while( ch < '0' || ch > '9' ) fg |= ( ch == '-' ) , ch = getchar() ;
while( ch >= '0' && ch <= '9' ) w = ( w << 1 ) + ( w << 3 ) + ( ch ^ '0' ) , ch = getchar() ;
return fg ? -w : w ;
}
int n , m , x , y , mid , res , now , d [N] ;
int cnt = 1 , fr [N << 1] , to [N << 1] , net [N << 1] , head [N << 1] , fg [N << 1] ;
#define add( f , t ) fr [++ cnt] = f , to [cnt] = t , net [cnt] = head [f] , head [f] = cnt
void sc(){
n = read() , m = read() ; memset( head , -1 , sizeof( head ) ) ;
for( R i = 1 ; i < n ; i ++ ) x = read() , y = read() , add( x , y ) , add( y , x ) ;
}
inline void check( int x ){
R i = head [x] ;
while( ~i && fg [i] ) i = net [i] ;
for( ; ~i ; i = net [i] ){
if( fg [i] ) continue ;
fg [i] = fg [i ^ 1] = 1 ;
int y = to [i] ;
check( y ) ;
if( d [x] + d [y] + 1 > mid ) res ++ , d [x] = min( d [x] , d [y] + 1 ) ; // 1是edge[i]
else d [x] = max( d [x] , d [y] + 1 ) ;
}
}
void work(){
int lside = 1 , rside = n , ans = 0 ;
while( lside <= rside ){
mid = ( lside + rside ) >> 1 ;
for( R i = 0 ; i < N ; i ++ ) d [i] = 0 ;
for( R i = 0 ; i < 2 * N ; i ++ ) fg [i] = 0 ;
res = 0 , check( 1 ) ;
if( res <= m ) ans = mid , rside = mid - 1 ;
else lside = mid + 1 ;
} printf( "%ld\n" , ans ) ;
}
signed main(){
sc() ;
work() ;
return 0 ;
}
题解—P3000 [USACO10DEC]Cow Calisthenics G的更多相关文章
- [USACO 2011 Dec Gold] Cow Calisthenics【二分】
Problem 1: Cow Calisthenics [Michael Cohen, 2010] Farmer John continues his never-ending quest to ke ...
- 2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed)
2021.11.03 P2886 [USACO07NOV]Cow Relays G(矩阵+floyed) [P2886 USACO07NOV]Cow Relays G - 洛谷 | 计算机科学教育新生 ...
- [USACO07DEC]Best Cow Line G 字符串hash || 后缀数组
[USACO07DEC]Best Cow Line G [USACO07DEC]Best Cow Line G 小声哔哔:字符串hash牛逼 题意 给出一个字符串,每次可以从字符串的首尾取出一个字符, ...
- P3000 [USACO10DEC]牛的健美操Cow Calisthenics
题目描述 Farmer John continues his never-ending quest to keep the cows fit by having them exercise on va ...
- USACO07NOV Cow Relays G 题解
题目 For their physical fitness program, \(N (2 ≤ N ≤ 1,000,000)\) cows have decided to run a relay ra ...
- 题解 P6098 【[USACO19FEB]Cow Land G】
震惊,蒟蒻学树剖第二天就打题解 所以说,理解之后树剖这种东西其实难度真心不大.至少这种模板题都可以秒切的 这里推荐一个博客: 树剖详解 蒟蒻就是在这个博客上学到的 如果想看我自己写的总结,请点 我的博 ...
- 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】
看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧. 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指重链剖分.当然,还有一种长链 ...
- 【luoguP3000】 [USACO10DEC]牛的健美操Cow Calisthenics
题目链接 二分答案,判断需要断几条边,用\(f[i]\)表示以\(i\)为根的子树断边后的最长路径,对于一个点\(u\),存在\(f[v]>mid\)时就删到\(v\)的边\(f[v1]+f[v ...
- P2340 [USACO03FALL]Cow Exhibition G题解
新的奇巧淫技 原题传送门 众所周知,模拟退火是一种很强大的算法,DP很强,但我模拟退火也不虚,很多题你如果不会的话基本可以拿来水很多分.比如这道题,我用模拟退火可以轻松水过(虽然我是足足交了两页才过) ...
随机推荐
- 华为高级研究员谢凌曦:下一代AI将走向何方?盘古大模型探路之旅
摘要:为了更深入理解千亿参数的盘古大模型,华为云社区采访到了华为云EI盘古团队高级研究员谢凌曦.谢博士以非常通俗的方式为我们娓娓道来了盘古大模型研发的"前世今生",以及它背后的艰难 ...
- I-Identical Day[题解]
原题目地址(牛客) Identical Day 题目大意 给定一个长度为 \(n\) 的 \(01\) 串,对于每段长度为 \(l\) 的连续的 \(1\) ,其权值为 \(\frac{l\times ...
- 网络流24题:最长 k 可重区间集问题题解
最长 k 可重区间集问题题解: 突然想起这个锅还没补,于是来把这里补一下qwq. 1.题意简述: 有\(n\)个开区间,这\(n\)个开区间组成了一个直线\(L\),要求选择一些区间,使得在直线\(L ...
- python 得到变量名的结果为名的变量的值locals()
>>> a="1">>> b="a">>> print(a,b)1 a>>> print ...
- 个人博客开发之blog-api 项目整合JWT实现token登录认证
前言 现在前后端分离,基于session设计到跨越问题,而且session在多台服器之前同步问题,肯能会丢失,所以倾向于使用jwt作为token认证 json web token 导入java-jwt ...
- 刚刚进公司不会SVN 菜鸟感觉好蛋疼-----------SVN学习记
这篇文章源于6月份给公司新人作的关于SVN使用的培训,转眼已经过了几个月的时间,丢了也怪可惜的,于是整理出来希望能够帮助后来人快速入门. 转载:https://blog.csdn.net/maplej ...
- 从新建文件夹开始构建ShadowPlay Engine游戏引擎(4)
本篇序言 这次博客更新距离上次的时间间隔变短了好多,因为最近硬是抽出了一大部分时间来进行引擎的开发.而且运气很好的是在写链表这种很"敏感"的的数据结构的时候并没有出现那种灾难性的后 ...
- 如何让Spring Boot 的配置动起来?
前言 对于微服务而言配置本地化是个很大的鸡肋,不可能每次需要改个配置都要重新把服务重新启动一遍,因此最终的解决方案都是将配置外部化,托管在一个平台上达到不用重启服务即可一次修改多处生效的目的. 但是对 ...
- vue(21)初识Vuex
Vuex是做什么的? 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式. 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vuex ...
- Redis学习——常用小功能
一.慢查询分析(查询日志:所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似的功 ...