BZOJ 2599: [IOI2011]Race
点分治模板
#include<cstdio>
#include<algorithm>
using namespace std;
int cnt,n,K,ans,N,root,F_top,last[1000005],sz[1000005],F_[1000005],vis[1000005],F_stack[1000005],G_stack[1000005],F[1000005],G[1000005];
struct node{int to,next,val;
}e[1000005];
void add(int a,int b,int c){e[++cnt].to=b;e[cnt].next=last[a];e[cnt].val=c;last[a]=cnt;
}
void find_root(int x,int fa){sz[x]=1,F_[x]=0;for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (V==fa || vis[V]) continue;find_root(V,x);sz[x]+=sz[V];F_[x]=max(F_[x],sz[V]);}F_[x]=max(F_[x],N-sz[x]);if (F_[x]<F_[root]) root=x;
}
void get_dis(int x,int fa,int val,int dep){sz[x]=1;if (val==K) ans=min(ans,dep);if (val<=K) F_stack[++F_top]=val;if (val<=K) F[val]=min(F[val],dep);for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (vis[V] || V==fa) continue;get_dis(V,x,val+e[i].val,dep+1);sz[x]+=sz[V];}
}
void solve(int x){int G_top=0;for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (vis[V]) continue;F_top=0;get_dis(V,x,e[i].val,1);for (int j=1; j<=F_top; j++) ans=min(ans,F[F_stack[j]]+G[K-F_stack[j]]);for (int j=1; j<=F_top; j++) G[F_stack[j]]=min(G[F_stack[j]],F[F_stack[j]]),F[F_stack[j]]=1e9,G_stack[++G_top]=F_stack[j];}for (int i=1; i<=G_top; i++) G[G_stack[i]]=1e9;
}
void divide(int x){vis[x]=1;solve(x);for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (vis[V]) continue;N=sz[V],root=0;find_root(V,x);divide(root);}
}
int main(){scanf("%d%d",&n,&K);for (int i=1; i<n; i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);x++,y++;add(x,y,z);add(y,x,z);}for (int i=1; i<=K; i++) F[i]=G[i]=1e9;ans=1e9;N=n,root=0;F_[0]=1e9;find_root(1,0);divide(root);if (ans!=1e9) printf("%d\n",ans);else printf("-1\n");return 0;
}
转载于:https://www.cnblogs.com/silenty/p/9783939.html
BZOJ 2599: [IOI2011]Race相关推荐
- bzoj 2599: [IOI2011]Race(树的点分治)
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MB Submit: 3862 Solved: 1144 [Submit][Sta ...
- BZOJ 2599: [IOI2011]Race 点分治题解
Time Limit: 70 Sec Memory Limit: 128 MB Submit: 3811 Solved: 1129 Description 给一棵树,每条边有权.求一条简单路径,权值和 ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- [BZOJ2599][IOI2011]Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MB Submit: 3934 Solved: 1163 [Submit][Sta ...
- P4149 [IOI2011]Race
P4149 [IOI2011]Race 题意: 给一棵树,每条边有权.求一条简单路径,权值和等于 k,且边的数量最小. 题解: 用t[i]:长度为i的路径包含的最少边数 按照子树顺序,依次用dep[u ...
- bzoj 2600: [Ioi2011]ricehub
2600: [Ioi2011]ricehub Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均 为一个 1 到 L 之间(含 ...
- [IOI2011]Race
题目链接:点这里 Solution: 点分治,算出点对之间的距离,记录所属子树和与跟之间的边数. 对于每个点,记录排序过后位置离自己最近的不同子树的点,记做go[x] 每次二分去更新,若遇到同一子树的 ...
- 【P4149 [IOI2011]Race】点分治
P4149 给一棵树,每条边有权.求一条简单路径,权值和等于 K,且边的数量最小. 输入格式 第一行包含两个整数 n, K. 接下来 n - 1 行,每行包含三个整数,表示一条无向边的两端和权值. 注 ...
- 一句话题解(20180210~)
2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...
最新文章
- 1.8 其他正则化方法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- 阿里再推社交“Real如我”,是电商巨头的流量焦虑
- C/C++之数据类型
- VTK:PolyData之MergePoints
- poj2479与poj2593 , 同一道DP题
- My FioriTest navigation from master page to detail page
- “Mom, isn‘t Su Ruoxia coming back today?
- HDU2014 青年歌手大奖赛_评委会打分【入门】
- android Fragment详解三:实现Fragment的界面
- MATLAB曲线拟合函数
- YYKit(Base模块)学习笔记
- 描述性统计分析案例题_SPSSAU描述性分析指标如何选择?
- matlab增加一行ones,MATLAB repmat()、ones()、zeros()、prod()函数的使用
- 海信在CES宣布推出75英寸到100英寸的全系全色激光电视产品
- 使用 Piral 创建微前端
- 文件包含漏洞——实例
- 今日头条(layout下xml布局)
- 【大数据开发】SparkCore——利用广播变量优化ip地址统计、Spark2.x自定义累加器
- mac u盘只读怎么修改_U盘插到苹果电脑总是只读 请问mac系统怎么设置U盘读写权限?...
- 识别12306验证码脚本