[USACO 2011 Dec Gold] Cow Calisthenics【二分】
Problem 1: Cow Calisthenics [Michael Cohen, 2010] Farmer John continues his never-ending quest to keep the cows fit
by having them exercise on various cow paths that run through the
pastures. These cow paths can be represented as a set of vertices
connected with bidirectional edges so that each pair of vertices
has exactly one simple path between them. In the abstract, their
layout bears a remarkable resemblance to a tree. Surprisingly, each
edge (as it winds its way through the pastures) has the same length. For any given set of cow paths, the canny cows calculate the longest
possible distance between any pair of vertices on the set of cowpaths
and call it the pathlength. If they think this pathlength is too
large, they simply refuse to exercise at all. Farmer John has mapped the paths and found V (2 <= V <= 100,000)
vertices, conveniently numbered from 1..V. In order to make shorter
cowpaths, he can block the path between any two vertices, thus
creating more sets of cow paths while reducing the pathlength of
both cowpath sets. Starting from a single completely connected set of paths (which
have the properties of a tree), FJ can block S (1 <= S <= V-1)
paths, creating S+1 sets of paths. Your goal is to compute the best
paths he can create so that the largest pathlength of all those
sets is minimized. Farmer John has a list of all V-1 edges in his tree, each described
by the two vertices A_i (1 <= A_i <= V) and B_i (1 <= B_i <= V; A_i
!= B_i) that it connects. Consider this rather linear cowpath set (a tree with 7 vertices): 1---2---3---4---5---6---7 If FJ can block two paths, he might choose them to make a map like
this:
1---2 | 3---4 | 5---6---7 where the longest pathlength is 2, which would be the answer in
this case. He can do no better than this. TIME LIMIT: 2 seconds MEMORY LIMIT: 32 MB PROBLEM NAME: exercise INPUT FORMAT: * Line 1: Two space separated integers: V and S * Lines 2..V: Two space separated integers: A_i and B_i SAMPLE INPUT (file exercise.in): 7 2
6 7
3 4
6 5
1 2
3 2
4 5 OUTPUT FORMAT: * Line 1: A single integer that is the best maximum pathlength FJ can
achieve with S blocks SAMPLE OUTPUT (file exercise.out): 2
不懂英文自行解决。。。
一看到最大值最小,就是二分,可是想了半天也没想出来如何check。看了题解,恍然大悟。
随便选一个根拉成一棵树,然后对于以r为根的子树,假设以其儿子节点为根的子树中该断的边已经断了,那么对于以r为根的子树中,其直径为“最深”的两个儿子i与j的深度之和 + 2,“最深”的意思是,以这两个节点往下走能走的最深。如果这个值大于二分的那个最大值,则最深的那个儿子就要断开与r的连接,这样直到“最深”的两个儿子i与j的深度之和 + 2 <= 二分的最大值。当有一个节点时同理,反正剩下就是细节了。
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <algorithm> const int maxn = 100005; int n, s, t1, t2, ans_s, root, biaozhun;
int head[maxn], to[maxn << 1], next[maxn << 1], lb;
std::vector<int> son[maxn]; inline void ist(int aa, int ss) {
to[lb] = ss;
next[lb] = head[aa];
head[aa] = lb;
++lb;
}
bool cmp(int aa, int ss) {
return aa > ss;
}
int dfs(int r, int p) {
for (int j = head[r]; j != -1; j = next[j]) {
if (to[j] != p) {
son[r].push_back(dfs(to[j], r));
}
}
std::sort(son[r].begin(), son[r].end(), cmp);
if (son[r].size() > 1) {
int lmt = son[r].size();
int i;
for (i = 0; i < lmt - 1; ++i) {
if (son[r][i] + son[r][i + 1] + 2 <= biaozhun) {
break;
}
++ans_s;
}
if (i == lmt - 1) {
if (son[r][i] + 1 > biaozhun) {
++ans_s;
return 0;
}
else {
return son[r][i] + 1;
}
}
else {
return son[r][i] + 1;
}
}
else if (son[r].size() == 1) {
if (son[r][0] + 1 > biaozhun) {
++ans_s;
return 0;
}
else {
return son[r][0] + 1;
}
}
else {
return 0;
}
}
inline bool check(int mx) {
ans_s = 0;
biaozhun = mx;
for (int i = 1; i <= n; ++i) {
son[i].clear();
}
dfs(root, 0);
return ans_s <= s;
} int main(void) {
freopen("exercise.in", "r", stdin);
freopen("exercise.out", "w", stdout);
memset(head, -1, sizeof head);
memset(next, -1, sizeof next);
unsigned seed;
scanf("%d%d", &n, &s);
seed += n + s;
for (int i = 1; i < n; ++i) {
scanf("%d%d", &t1, &t2);
seed += t1 + t2;
ist(t1, t2);
ist(t2, t1);
}
srand(seed);
root = rand() % n + 1; int left = 0, right = n, mid;
while (left != right) {
mid = (left + right) >> 1;
if (check(mid)) {
right = mid;
}
else {
left = mid + 1;
}
}
printf("%d\n", left);
return 0;
}
[USACO 2011 Dec Gold] Cow Calisthenics【二分】的更多相关文章
- [USACO 2011 Nov Gold] Cow Steeplechase【二分图】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=93 很容易发现,这是一个二分图的模型.竖直线是X集,水平线是Y集,若某条竖 ...
- [USACO 2011 Dec Gold] Threatening Letter【后缀】
Problem 3: Threatening Letter [J. Kuipers, 2002] FJ has had a terrible fight with his neighbor and w ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- BZOJ1774[USACO 2009 Dec Gold 2.Cow Toll Paths]——floyd
题目描述 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费 ...
- Usaco 2010 Dec Gold Exercise(奶牛健美操)
/*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/ #include<cstdio> #include<queue> #include<cst ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- [USACO 2011 Nov Gold] Above the Median【逆序对】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91 这一题我很快的想出了,把>= x的值改为1,< x的改为- ...
- bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOn ...
- USACO 2011 February Silver Cow Line /// 康拓展开模板题 oj22713
题目大意: 输入n k,1-n的排列,k次操作 操作P:输入一个m 输出第m个排列 操作Q:输入一个排列 输出它是第几个排列 Sample Input 5 2P3Q1 2 5 3 4 Sample O ...
随机推荐
- 生产环境之Nginx高可用方案
准备工作: 192.168.16.128 192.168.16.129 两台虚拟机.安装好Nginx 安装Nginx 更新yum源文件: rpm -ivh http://nginx.org/packa ...
- coco2d-js demo程序之滚动的小球
近期有一个游戏叫围住神经猫,报道说是使用html5技术来做的. html5的跨平台的优良特性非常不错.对于人手不足,技术不足,选用html5技术实现跨平台的梦想真是不错. 近期在看coco2d-js这 ...
- 4 自动化构建工具gulp
gulp中文网:http://www.gulpjs.com.cn/ 需要全局安装gulp:$ npm install --global gulp 具体的gulp的使用方法,可以参看gulp中文网的文档 ...
- 2016/05/25 empty() 与 isset()的区别
对于初学php的人来说,empty()和和isset()用法的区别是很难搞清楚的,他们的用法的差别不仔细去琢磨的话确实很难弄清楚. 先说一下他们的共同点: 都可以判定一个变量是否为空: 都返回bool ...
- Windows平台cocos2d-x 3.0 android开发环境
cocos2d-x升级到3.0后变化不小,除了API的变化(主要是函数和类名称变化,以及使用了C++11的不少特性.function/bind, lamda, std::thread-),创建和编译p ...
- Lightoj 1009 - Back to Underworld
1009 - Back to Underworld PDF (English) Statistics Forum Time Limit: 4 second(s) Memory Limit: 32 ...
- [原创] [C#] 转换Excel数字列号为字母列号
转换Excel数字列号为字母列号 例如: 0 -> A 26 -> AA private static string GetColumnChar(int col) { ; ; ) ) + ...
- bzoj1560: [JSOI2009]火星藏宝图
考虑到一个性质,A到B的距离一定不小于A到C再到B的距离,因为能够到达这三个点不可能构成锐角三角形 对于当前点的更新只需要找那些无法经过其它点再到当前点的点,相当于是一个y坐标单调减的上凸包,随便维护 ...
- Ubuntu下Jupyter Notebook的安装
pip install --upgrade pip //更新pip pip install jupyter sudo apt install jupyter-notebook 运行 jupyter-n ...
- 蓝牙4.0 BLE 广播包解析
在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播包进行分析.在学习BLE的时候,下面两个文档是极其重要的,这是SIG发布的蓝牙的核心协议和核心协议增补 ...