[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 ...
随机推荐
- spring mvc 选中多文件同时上传(利用input元素的multiple属性)
原文:http://m.blog.csdn.net/article/details?id=51351388 <!DOCTYPE html> <html> <head> ...
- atomic原子操作
C++中对共享数据的存取在并发条件下可能会引起data race的未定义行为,需要限制并发程序以某种特定的顺序执行,有两种方式:1.使用mutex保护共享数据: 2.原子操作 原子操作:针对原子类型操 ...
- CentOS系统如何设置服务开机自动运行
centos安装好apache,mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了.例如要开机 ...
- UVA 1400 1400 - "Ray, Pass me the dishes!"(线段树)
UVA 1400 - "Ray, Pass me the dishes!" option=com_onlinejudge&Itemid=8&page=show_pr ...
- input from 表单提交 使用 属性 disabled="disabled" 后台接收不到name="username"的值
input from 表单提交 使用 属性 disabled="disabled" 后台接收不到name="username"的值
- Redis入门教程(三)— Java中操作Redis
在Redis的官网上,我们可以看到Redis的Java客户端众多 其中,Jedis是Redis官方推荐,也是使用用户最多的Java客户端. 开始前的准备 使用jedis使用到的jedis-2.1.0. ...
- [QT开发小结]LNK1104: cannot open file ‘gdi32.lib’ 解决方法
1.环境变量 : Path = ;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin; 添加变量: INCLUDE = C:\Program ...
- java中字节数组byte[]和字符(字符串)之间的转换
转自:http://blog.csdn.net/linlzk/article/details/6566124 Java与其他语言编写的程序进行tcp/ip socket通讯时,通讯内容一般都转换成by ...
- BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机+贪心
BZOJ_2099_[Usaco2010 Dec]Letter 恐吓信_后缀自动机 Description FJ刚刚和邻居发生了一场可怕的争吵,他咽不下这口气,决定佚名发给他的邻居 一封脏话连篇的信. ...
- 【转】axios全攻略
随着 vuejs 作者尤雨溪发布消息,不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文 ...