[coci2015-2016 coii] torrent【树形dp 二分】
传送门:http://www.hsin.hr/coci/archive/2015_2016/
进去之后点最下面那个。
这道题没有想出来,可惜了,其实不难的。
题目是两个“源”的,我们先考虑单源的问题。先把这个源拉成树根,然后设f(i)为以结点i为树根的子树,全部收到文件所需要的时间,由于同一时间,结点i只能向其中一个子结点传送文件,那么假设son(i, j)表示结点i的第j个子结点(程序中不需要这个数组,这里只是为了叙述方便),那么f(i) = max{ j + f( son(i, j) )}。为了让这个max值最小,很显然需要把f( son(i, j) )按照从大到小排,即子树所需时间越长的,结点i就应该越早传文件给它。这样子就解决了单源的问题。
那么再考虑双源的。考虑从a到b的路径,若a到b的路径上,存在相邻的c,d两个点,很显然,在最佳方案里一定会有文件从a传到c,从b传到d,所以,如果把(c, d)这条边断开也不会影响到答案,这就变成了求两次单源的问题。因此,若把a到b的路径上的边按离a从远到近编号,设f_a(i)表示断开边i后,a所属的那棵树所需要的时间,设f_b(i)表示断开边i后,b所属的那棵树所需要的时间,那么最终答案ans = min{ max{f_a(i), f_b(i)} }。
这样会tle(我会说std有一个点,在我们学校的垃圾电脑上跑了92s吗?时限可是2s啊喂!你这标程怎么写的!),因此需要优化。很显然(又是显然),断开的边i离a越远,f_a(i)就会越大(其实也可以取等),f_b(i)就会越小(其实也可以取等),因此可以再二分一下断哪条边,就ok了!复杂度是O(n * (logn)^2)
p.s.主函数的前三行是开栈,以免递归爆栈。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm> const int maxn = 300005; int n, a, b, t1, t2;
int head[maxn], to[maxn << 1], next[maxn << 1], lb, fa[maxn];
char mark[maxn];
std::vector<int> fson[maxn];
struct edge {
int u, v;
} e[maxn];
int idx; inline void ist(int aa, int ss) {
to[lb] = ss;
next[lb] = head[aa];
head[aa] = lb;
++lb;
}
void dfs(int r, int p) {
fa[r] = p;
for (int j = head[r]; j != -1; j = next[j]) {
if (to[j] != p) {
dfs(to[j], r);
}
}
}
int get_ans(int r, int p, int mar) {
fson[r].clear();
int son_num = 0, mx = 0;
for (int j = head[r]; j != -1; j = next[j]) {
if (to[j] != p && mark[to[j]] != -mar) {
fson[r].push_back(get_ans(to[j], r, mar));
++son_num;
}
}
std::sort(fson[r].begin(), fson[r].end());
for (std::vector<int>::iterator it = fson[r].begin(); it != fson[r].end(); ++it) {
mx = std::max(mx, *it + son_num);
--son_num;
}
return mx;
} int main(void) {
int size = 256 << 20; // 256MB
char *p = (char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p));
freopen("torrent.in", "r", stdin);
freopen("torrent.out", "w", stdout);
memset(head, -1, sizeof head);
memset(next, -1, sizeof next);
scanf("%d%d%d", &n, &a, &b);
for (int i = 1; i < n; ++i) {
scanf("%d%d", &t1, &t2);
ist(t1, t2);
ist(t2, t1);
} dfs(a, 0);
for (int i = b; i != a; i = fa[i]) {
e[idx++] = (edge){fa[i], i};
} int left = 0, right = idx - 1, mid;
while (left < right) {
mid = (left + right) >> 1;
mark[e[mid].u] = -1;
mark[e[mid].v] = 1;
if (get_ans(a, 0, -1) > get_ans(b, 0, 1)) {
left = mid + 1;
}
else {
right = mid;
}
mark[e[mid].u] = mark[e[mid].v] = 0;
}
if (!left) {
mark[e[0].u] = -1;
mark[e[0].v] = 1;
printf("%d\n", get_ans(b, 0, 1));
}
else {
int ans1 = -666, ans2 = -666;
mark[e[left].u] = -1;
mark[e[left].v] = 1;
ans1 = get_ans(b, 0, 1);
mark[e[left].u] = mark[e[left].v] = 0; mark[e[left - 1].u] = -1;
mark[e[left - 1].v] = 1;
ans2 = get_ans(a, 0, -1);
printf("%d\n", std::min(ans1, ans2));
}
return 0;
}
[coci2015-2016 coii] torrent【树形dp 二分】的更多相关文章
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- hdu 3586 Information Disturbing(树形dp + 二分)
本文出自 http://blog.csdn.net/shuangde800 题目链接: hdu-3586 题意 给一棵n个节点的树,节点编号为1-n,根节点为1.每条边有权值,砍掉一条边要花费 ...
- BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案
题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...
- hdu 3586 树形dp+二分
题目大意:给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵 树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线.现要切断前线和司令部的联系,每次切断边的费用不能超过上限lim ...
- 【BZOJ3872】[Poi2014]Ant colony 树形DP+二分
[BZOJ3872][Poi2014]Ant colony Description 给定一棵有n个节点的树.在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁.这些蚂蚁会相继进入树中, ...
- [hdu3586]Information Disturbing树形dp+二分
题意:给出一棵带权无向树,以及给定节点1,总约束为$m$,找出切断与所有叶子节点联系每条边所需要的最小价值约束. 解题关键:二分答案,转化为判定性问题,然后用树形dp验证答案即可. dp数组需要开到l ...
- HDU - 3586 Information Disturbing 树形dp二分答案
HDU - 3586 Information Disturbing 题目大意:从敌人司令部(1号节点)到前线(叶子节点)的通信路径是一个树形结构,切断每条边的联系都需要花费w权值,现在需要你切断前线和 ...
- HDU 3586 Information Disturbing 树形DP+二分
Information Disturbing Problem Description In the battlefield , an effective way to defeat enemies ...
- hdu3586 Information Disturbing 树形DP+二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 题目大意:给定n个敌方据点,编号1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值c ...
随机推荐
- 数据结构之 线性表---单链表操作A (删除链表中的指定元素)
数据结构上机测试2-1:单链表操作A Time Limit: 1000MS Memory limit: 4096K 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据 ...
- 自动化测试框架selenium+java+TestNG——TestNG注解、执行、测试结果和测试报告
TestNG是java的一个测试框架,相比较于junit,功能更强大和完善,我是直接学习和使用的TestNG就来谈下TestNG的一些特点吧. TestNG的特点 注解 TestNG使用Java和面向 ...
- java后台获取cookie里面值得方法
String admissionNo = ""; //得到所有的cookies Cookie[] cookies = this.getRequest().getCookies(); ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- Strom配置说明
在进群生产环境下运行Topology和在本地模式下运行非常相似.下面是步骤: 1.定义Topology(如果使用Java开发语言,则使用TopologyBuilder来创建) 2.使用StormSub ...
- py-day2-sys模块、os模块、运算符、列表、字典
一.sys 模块 import sys print (sys.path)#打印环境变量 print(sys.aegv) #打印脚本的名字相对路径 print(sys.aegv)1 2 3 4 prin ...
- wampServer 设置
设置端口 打开 C:\wamp\bin\apache\apache2.4.9\conf\httpd.conf 文件 找到“Listen 80”和“ServerName localhost:80”,紧接 ...
- ** Error in `./g2o_viewer': realloc(): invalid pointer:
问题: defe@defe-Precision-Tower-3620:~/project/Demo/UseG2OforPoseGraph/useg2oforposegraph$ ./g2o_viewe ...
- 【eclipse插件开发实战】Eclipse插件开发1——eclipse内核结构、扩展点机制
Eclipse插件开发实战1--eclipse内核结构.扩展点机制 一.前言 本系列总体介绍eclipse插件开发基本理论.插件项目结构及开发步骤,最后再给出两个插件开发实例. 总体安排结构如下: 1 ...
- 关于weblogic 10.3.6.0 的漏洞复现(2)
今天小R又学会了一个工具的使用,而且这个工具很强大很强大. 待会介绍. 一.需要的试验环境: 一台宿主机,虚拟机(kali+window2008或其他版本的windows) 1.宿主机需要的工具:B ...