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$ 然后现在考虑加入这个长度的限制?就考虑把这 ...
随机推荐
- jQuery学习小结
1.jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").clic ...
- Python中导入第三方声源库Acoular的逻辑解释以及Acoular的下载
[声明]欢迎转载,但请保留文章原始出处→_→ 秦学苦练:http://www.cnblogs.com/Qinstudy/ 文章来源:http://www.cnblogs.com/Qinstudy/p/ ...
- 新型USB病毒BadUSB 即使U盘被格式化也无法根除
这种病毒并不存在于USB设备中的存储文件中,而是根植于USB设备的固件里.这意味着,即使用户对U盘进行全面的格式化清理,仍不能"杀死"它.
- MLDS笔记:Generalization
1 泛化能力 用VC维来衡量一个模型的表达能力,比如2维线性模型的VC维为3. 在图1-2中,随便给啥训练数据该model都能learn起来. 从理论上来看,当2个model在训练数据上表现一样时,为 ...
- golang基础- ElasticSearch搜索引擎、kibana可视化工具、向ES输出数据
转载自:https://blog.csdn.net/u013210620/article/details/78647366 安装ElasticSearch ElasticSearch是一个基于Luce ...
- python argparse用法总结
转:python argparse用法总结 1. argparse介绍 argparse是python的一个命令行解析包,非常适合用来编写可读性非常好的程序. 2. 基本用法 prog.py是我在li ...
- git push The requested URL returned error: 403 Forbidden while accessing
错误提示信息: error: The requested URL returned error: Forbidden while accessing https://github.com/xingfu ...
- JavaScript对json操作小记
JSON是一种轻量级的数据交换格式,同时,JSON是 JavaScript 原生格式,因此我们可以直接处理它不需要依赖任何工具包或者插件.因此,好多后台都会选择返回给前端这种非常友好的数据格式. 引子 ...
- String 类的函数实现
#include<iostream> //#include<string> using namespace std; class Strings { public: Strin ...
- QTP自动化测试流程
1)准备TestCase - 在进行自动化之前,将测试内容进行文档化,不建议直接录制脚本 - 在录制脚本之前设计好脚本,便于录制过程的流畅 - 由于测试用例设 ...