BZOJ_2599_[IOI2011]Race_点分治
BZOJ_2599_[IOI2011]Race_点分治
Description
给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000
Input
第一行 两个整数 n, k
第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始)
Output
一个整数 表示最小边数量 如果不存在这样的路径 输出-1
Sample Input
0 1 1
1 2 2
1 3 4
Sample Output
2
点分治。开个桶记录一下长度为x的路径最小的深度。
如何去重?我们开一个辅助桶存一下根的当前儿子的子树内的贡献。
保证每次查的时候用的是其他儿子的子树的路径。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 200050
#define inf 100000000
int head[N],to[N<<1],nxt[N<<1],cnt,val[N<<1];
int root,sum,siz[N],f[N],g[1000050],d[N],n,k,ans,dep[N],tmp[1000050],a[N],b[N];
bool used[N];
inline void add(int u,int v,int w) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
}
void get_root(int x,int y) {
siz[x]=1; f[x]=0;
int i;
for(i=head[x];i;i=nxt[i]) if(to[i]!=y&&!used[to[i]]) {
get_root(to[i],x);
siz[x]+=siz[to[i]];
f[x]=max(f[x],siz[to[i]]);
}
f[x]=max(f[x],sum-siz[x]);
if(f[x]<f[root]) root=x;
}
void get_dep(int x,int y) {
b[++b[0]]=x;
a[++a[0]]=x;
siz[x]=1;
dep[x]=dep[y]+1;
//printf("x=%d dep[x]=%d\n",x,dep[x]);
if(d[x]<=k) {
ans=min(ans,g[k-d[x]]+dep[x]-2);
tmp[d[x]]=min(tmp[d[x]],dep[x]);
}
int i;
for(i=head[x];i;i=nxt[i]) if(to[i]!=y&&!used[to[i]]) {
d[to[i]]=d[x]+val[i];
get_dep(to[i],x);
siz[x]+=siz[to[i]];
}
}
void work(int x) {
g[0]=1;
used[x]=1;
d[x]=0;
int i,j;
b[0]=0;
siz[x]=1;
dep[x]=1;
for(i=head[x];i;i=nxt[i]) if(!used[to[i]]) {
a[0]=0;
d[to[i]]=val[i];
get_dep(to[i],x);
siz[x]+=siz[to[i]];
for(j=1;j<=a[0];j++) if(d[a[j]]<=k) {
g[d[a[j]]]=min(g[d[a[j]]],tmp[d[a[j]]]);
}
for(j=1;j<=a[0];j++) if(d[a[j]]<=k) tmp[d[a[j]]]=inf;
}
for(i=1;i<=b[0];i++) if(d[b[i]]<=k) {
g[d[b[i]]]=tmp[d[b[i]]]=inf;
}
g[0]=tmp[0]=inf;
for(i=head[x];i;i=nxt[i]) if(!used[to[i]]) {
root=0;
sum=siz[to[i]];
get_root(to[i],0);
work(root);
}
}
int main() {
scanf("%d%d",&n,&k);
int i,x,y,z;
for(i=0;i<=k;i++) g[i]=tmp[i]=inf;
for(i=1;i<n;i++) {
scanf("%d%d%d",&x,&y,&z);
x++;y++;
add(x,y,z);add(y,x,z);
}
sum=n;
f[0]=inf;
ans=1<<30;
root=0;
get_root(1,0);
work(root);
printf("%d\n",ans>n?-1:ans);
}
BZOJ_2599_[IOI2011]Race_点分治的更多相关文章
- [bzoj2599][IOI2011]Race_树上点分治
Race bzoj-2599 题目大意:询问一颗树上最短的.长度为k的链,边有边权,n个节点. 注释:$1\le n \le 2\cdot 10^5$,$1\le k \le 10^6$. 想法:树上 ...
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- [IOI2011]Race 点分治
[IOI2011]Race LG传送门 点分治板子题. 直接点分治统计,统计的时候开个桶维护下就好了. 注(tiao)意(le)细(hen)节(jiu). #include<cstdio> ...
- [bzoj2599][IOI2011]Race——点分治
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...
- bzoj2599/luogu4149 [IOI2011]Race (点分治)
点分治.WA了一万年. 重点就是统计答案的方法 做法一(洛谷AC bzojWA 自测WA): 做点x时记到x距离为k的边数最小值为dis[k],然后对每一对有值的dis[i]和dis[K-i],给an ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- 洛谷 4149 [IOI2011]Race——点分治
题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之 ...
- P4149 [IOI2011]Race 点分治
思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双 ...
- 洛谷$P4149\ [IOI2011]\ Race$ 点分治
正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这 ...
随机推荐
- CXF 5参考资料
下载 描述 名字 大小 下载方法 本教程示例应用程序的源代码 CXF_Spring_Survey_Src.war 10 KB HTTP 关于下载方法的信息 学习 Apache CXF 的官方站点:提供 ...
- 简单验证码的识别:Bitmap类的使用
验证码的智能识别是一项比较复杂的工作,甚至需要掌握点图像学的知识. 当然对于写程序的来说不用那么深入,只需要掌握几个常规步骤就行了. 验证码图像识别步骤:1.获取图像 2.清除边框 3.灰度处理 4. ...
- java解析XML文件四种方法之引入源文件
1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Documen ...
- 利用Python进行数据分析
最近在阅读<利用Python进行数据分析>,本篇博文作为读书笔记 ,记录一下阅读书签和实践心得. 准备工作 python环境配置好了,可以参见我之前的博文<基于Python的数据分析 ...
- notepad++中双击选中字符串高亮颜色设置
notepad++ 中最好用的功能就是双击选中,本文档中所有相同的内容高亮 不过有个问题就是当文档特别大,而且注释比较多的时候,我选中的内容高亮为绿色不太好找,那怎么设置呢? 设置--语言格式设置-- ...
- SOFA 源码分析 — 负载均衡和一致性 Hash
前言 SOFA 内置负载均衡,支持 5 种负载均衡算法,随机(默认算法),本地优先,轮询算法,一致性 hash,按权重负载轮询(不推荐,已被标注废弃). 一起看看他们的实现(重点还是一致性 hash) ...
- eclipse中maven下载不了私服上面的第三方包问题
问题描述在nexus中上传了第三方jar包,在本地项目中添加了引用,但就是下载不下来. 转载文章 1. 打开windows -> preferences -> maven,勾选如图所示 2 ...
- var与let、const的区别
var与let.const 一.var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100;console.log(a,window.a); // 100 1 ...
- Python 描述符是什么?以及如何实现
先看一个例子,@property.被@property修饰的成员函数,将变为一个描述符.这是最简单的创建描述符的方式. class Foo: @property def attr(self): pri ...
- VM虚拟机链接克隆及linux eth0网卡的快速设置方法
对于后台开发者来说,在学习过程中必然接触众多中间件,在自己的虚拟机进行操作甚至搭建cluster是很常见的事情. 我在初学者时摸索出一套快速的克隆虚拟机方法.分享给大家. 产品VMware® Work ...