点分治 [IOI2011]Race
BZOJ2599.
放板子。利用agc009-D 代码简洁了很多
- #include <bits/stdc++.h>
- #define N 200005
- using namespace std;
- int n,m,K,F[N][],H[N],x,y,z,h[N],f[],T,O,e[N],ans,d[N],g[N],t;
- vector <int> a[N],b[N];
- void QH(int x,int fa){
- int y,z=-;
- for (int i=;i<a[x].size();++i)
- if (a[x][i]!=fa){
- QH(y=a[x][i],x);
- for (int j=;j<;++j){
- if (F[y][j]&F[x][j]) z=max(z,j);
- F[x][j]|=F[y][j];
- }
- }
- for (++z;F[x][z];++z);
- F[x][z]=; H[x]=z;
- for (--z;~z;--z) F[x][z]=;
- }
- void dfs(int x,int y,int o){
- if (h[x]>K) return;
- d[++t]=h[x]; g[t]=o; e[++T]=x;
- ans=min(ans,f[K-h[x]]+o);
- for (int i=;i<a[x].size();++i)
- if (H[a[x][i]]<O&&a[x][i]!=y){
- h[a[x][i]]=h[x]+b[x][i];
- dfs(a[x][i],x,o+);
- }
- }
- void go(int x){
- O=H[x]; h[x]=T=;
- for (int i=;i<a[x].size();++i)
- if (H[a[x][i]]<O){
- h[a[x][i]]=h[x]+b[x][i];
- t=; dfs(a[x][i],x,);
- for (int j=;j<=t;++j) f[d[j]]=min(f[d[j]],g[j]);
- }
- for (int i=;i<=T;++i) f[h[e[i]]]=n+;
- }
- int main(){
- scanf("%d%d",&n,&K);
- for (int i=;i<n;++i){
- scanf("%d%d%d",&x,&y,&z);
- ++x; ++y;
- a[x].push_back(y);
- b[x].push_back(z);
- a[y].push_back(x);
- b[y].push_back(z);
- }
- QH(,); ans=n+;
- for (int i=;i<=K;++i) f[i]=n+;
- for (int i=;i<=n;++i) go(i);
- printf("%d\n",ans>n?-:ans);
- return ;
- }
云流
点分治 [IOI2011]Race的更多相关文章
- 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 我们考虑点分治. 对于子树,我们递归处理,所 ...
- 模板—点分治B(合并子树)(洛谷P4149 [IOI2011]Race)
洛谷P4149 [IOI2011]Race 点分治作用(目前只知道这个): 求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数. 算 ...
- 【BZOJ2599】[IOI2011]Race 树的点分治
[BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 100000 ...
- [IOI2011]Race
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...
- bzoj 2599 [IOI2011]Race 点分
[IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 4768 Solved: 1393[Submit][Status][Dis ...
- 2599: [IOI2011]Race
2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...
- bzoj2599: [IOI2011]Race(点分治)
写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...
随机推荐
- 《从0到1》读书笔记第一章"未来的挑战"第2记:做老子还是做孙子
从1到N VS 从0到1 - 别让自己的小鸡鸡抓在别人的手上 近几年国内互联网创业上非常流行一种C2C(也就是Copy to China - 复制到中国)的创业模式,打的就是一个时间差和地域差.将在国 ...
- hdu 5389 Zero Escape (dp)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②反复①直到得到的数仅仅有1位.给定n,A ...
- hdoj 4828 卡特兰数取模
Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Sub ...
- Android摄像头採集的视频数据流怎样通过Socket实时发送到目标服务端
分两块: 1.取得摄像头採集的视频流 2.发送到server端 protected MediaRecorder mMediaRecorder; private LocalServerSocket mL ...
- 笔记04 WPF对象引用
转自:http://www.fx114.net/qa-261-90254.aspx 我们应该都知道,XAML是一种声明式语言,XAML的标签声明的就是对象.一个XAML标签会对应着一个对象,这个对象一 ...
- 前端UI框架整理
JQuery Jquery官网:http://jquery.com/ jQuery是一个快速,小巧,且功能丰富的JavaScript库. Jquery-1.11.3.min.js 压缩版:http:/ ...
- 6.6.1 F# 中函数调用的类型判断
6.6.1 F# 中函数调用的类型判断 尽管,在 F# 中能够用尖括号指定类型參数值.与 C# 中的方式同样.但这样的方法非常少使用. 原因是,当编译器无法判断出全部的信息,须要程序猿的帮助时.我们仅 ...
- 文件I/O相关函数
open()和openat()函数: #include <fcntl.h> // 成功返回文件描述符,出错返回-1 int open(const char *path, int oflag ...
- Html调用 QQ接口
<A href="tencent://message/?uin=1805843351&Site=有事Q我&Menu=yes"> <img styl ...
- FFmpeg解码详细流程
FFmpeg在解码一个视频的时候的函数调用流程.为了保证结构清晰,其中仅列出了最关键的函数,剔除了其它不是特别重要的函数. 下面解释一下图中关键标记的含义. 函数背景色 函数在图中以方框的形式表现出来 ...