noip 2018 D1T3 赛道修建
noip 2018 D1T3 赛道修建
首先考虑二分答案,这时需要的就是对于一个长度求出能在树中选出来的最多的路径条数。考虑到一条路径是由一条向上的路径与一条向下的路径构成,或者仅仅是向上或向下的路径构成。
设\(f_i\)为i这颗子树中最多能选出来多少条路径,\(g_i\)为在i这颗子树内选出来\(f_i\)条路径后最多能往下延伸多么长的距离,就是以i点为端点向i的子树内可以选出来的最长的路径。
考虑一颗以i为根的子树,首先\(f_i=\sum_{j\in the\ son\ of\ i}f_j\),然后对i的所有儿子的\(g_j+w_{i,j}\)排序,如果该值大于二分的答案,则直接将这个看成一条单独的路径一定不会更劣,那么直接将\(f_i\)加一。
然后从小到大枚举这个值,找到另一个最小的未被使用过的值使得两个数相加大于答案,并删掉这两个值。如果找不到这样的值,则用枚举的这个值更新\(g_i\)。
实现的时候可以用multiset,时间复杂度大概是\(O(nlog^2n)?\)
但是我的常数好大啊,在洛谷上开个O2就过了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;
const int Maxn=110000;
int to[Maxn],w[Maxn],nxt[Maxn],first[Maxn],f[Maxn],g[Maxn],tot=1;
int n,m,mid,u,v,wi;
inline void add(int u,int v,int wi) {
to[tot]=v;
w[tot]=wi;
nxt[tot]=first[u];
first[u]=tot++;
to[tot]=u;
w[tot]=wi;
nxt[tot]=first[v];
first[v]=tot++;
}
void work(int root,int fa) {
f[root]=g[root]=0;
multiset<int>se;
vector<int>vi;
for(int i=first[root];i;i=nxt[i])
if(to[i]!=fa) {
work(to[i],root);
int temp=g[to[i]]+w[i];
f[root]+=f[to[i]];
if(temp>=mid) {
f[root]++;
continue;
}
vi.push_back(temp);
se.insert(temp);
}
sort(vi.begin(),vi.end());
for(vector<int>::iterator i=vi.begin();i!=vi.end();i++)
if(se.count(*i)) {
se.erase(se.find(*i));
multiset<int>::iterator j=se.lower_bound(mid-*i);
if(j==se.end())
g[root]=*i;
else {
f[root]++;
se.erase(j);
}
}
}
int main() {
// freopen("test.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++) {
scanf("%d%d%d",&u,&v,&wi);
add(u,v,wi);
}
int l=1,r=0x3f3f3f3f;mid=100000;int ans=1;
work(1,1);
if(f[1]<m) r=99999;
else l=100000,ans=100000;
while(l<=r) {
// memset(f,0,sizeof(f));
// memset(g,0,sizeof(g));
work(1,1);
if(f[1]>=m) {
ans=mid;
l=mid+1;
}
else r=mid-1;
mid=l+r>>1;
}
printf("%d\n",ans);
return 0;
}
noip 2018 D1T3 赛道修建的更多相关文章
- noip2018 D1T3 赛道修建
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,…,n1,2,…,n,有 n-1n−1 条适合于修建赛道的双向通 ...
- 赛道修建 NOIP 2018 d1t3
题目大意 最小值最大 考虑二分 二分答案 判断能不能构成m条路径 很明显满足单调性 可行 思考如何判断 对于一个节点 它的儿子会传上来一些路径 这些路径只有三种处理方式 一.传上去(只能传一条) 二. ...
- [NOIP2018 TG D1T3]赛道修建
题目大意:$NOIP2018\;TG\;D1T3$ 题解:题目要求最短的赛道的长度最大,可以想达到二分答案,接着就是一个显然的树形$DP$. 发现对于一个点,它子树中若有两条链接起来比要求的答案大,一 ...
- NOIP2018 D1T3赛道修建
题目链接:Click here Solution: 最小值最大,考虑二分一个答案\(k\) 考虑在子树内先匹配,最后传递一个值给自己的父亲(因为每条边只能用一次,所以一颗子树最多传递一个值) 那么我们 ...
- NOIP提高组2018 D1T3 【赛道修建】
颓了好几天,终于把这到题处理了一下. 话说,其实我考场上想出正解了,但是手残,算复杂度的时候多按了一个零,导致算出来是1亿多的复杂度,都不敢打...就把部分分都捡了一下... 题目描述: C 城将要举 ...
- 二分答案 + multiset || NOIP 2018 D1 T3 || Luogu P5021 赛道修建
题面:P5021 赛道修建 题解:二分答案,用Dfs进行判断,multiset维护. Dfs(x,fa,Lim)用来计算以x为根的子树中有多少符合条件的路径,并返回剩余未使用的最长路径长. 贪心思想很 ...
- NOIP 2018 day1 题解
今年noip的题和去年绝对是比较坑的题了,但是打好的话就算是普通水准也能350分以上吧. t1: 很显然这是一个简单的dp即可. #include<iostream> #include&l ...
- 【LG5021】[NOIP2018]赛道修建
[LG5021][NOIP2018]赛道修建 题面 洛谷 题解 NOIP之前做过增强版还没做出来\(QAQ\) 一看到题目中的最大值最小,就很容易想到二分答案 重点是考虑如何\(check\) 设\( ...
- P5021 赛道修建[贪心+二分]
题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 mm 条赛道. C 城一共有 nn 个路口,这些路口编号为 1,2,-,n1,2,-,n,有 n-1n−1 条适合于修建赛道的双向通 ...
随机推荐
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...
- Python - 3.6 学习第一天
开始之前 基础示例 Python语法基础,python语法比较简单,采用缩紧方式. # print absolute value of a integer a = 100 if a >= 0: ...
- squid 高匿设置
1.透明代理.匿名代理.混淆代理.高匿代理有什么区别 这4种代理,主要是在代理服务器端的配置不同,导致其向目标地址发送请求时,REMOTE_ADDR, HTTP_VIA,HTTP_X_FORWARDE ...
- 豆瓣api开发
前面有说过豆瓣API的开发,在做一些开源项目的时候,很多时候会用到豆瓣API接口,拿过来做测试,现在只是对豆瓣API开发做一些简单的梳理: 豆瓣API开发的接口: https://developers ...
- vue-cli 项目打包异常汇总
1.打包路径错误 npm run build 之后,会发现项目目录下多了 通过 localhost 运行 index.html 会发现空白,仔细一看,是因为引用的资源位置问题 明显这个地方应该是 ./ ...
- python2在安装pywin32后出现ImportError: DLL load failed 解决方法
python2在安装pywin32后出现ImportError: DLL load failed 解决方法 在python2中有时候会出现: import win32api ImportError ...
- 'module' object has no attribute 'select'
和tensorflow的版本有关系 新版本 将tf.select替换为tf.where
- K-均值聚类(K-means)算法
https://www.cnblogs.com/ybjourney/p/4714870.html 最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学pytho ...
- github push error ---- recursion detected in die handler
错误提示如下: 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 New Bitmap Image.bmp Coun ...
- Mirror--镜像断开的解决办法
如果镜像在搭建一段时候后出现问题,可能存在以下原因: 1. 因为主库或镜像库存在内存压力,导致无法完成镜像日志传送和重做 解决办法:设置数据库最小内存,保证数据库有足够内存完成镜像操作 2. 因为主库 ...