点分治 [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的点对中连接两点的最小边数. 那么其实道理是 ...
随机推荐
- zerorpc的安装
1.简介及安装 rpc使构建分布式系统简单许多,在云计算的实现中有很广泛的应用 rpc可以是异步的 python实现rpc,可以使用标准库里的SimpleXMLRPCServer,另外zerorpc是 ...
- C++ ADO 连接 mysql
1.安装mysql-5.0.22-win32,mysql-connector-odbc-5.1.12-win32.msi 然后:开始菜单->设置->控制面板->管理工具-> ...
- jvm基础(1)
1.整型数和浮点型数的表示 原码:第一位为符号位(0为正数,1为负数). 反码:符号位不动,源码取反. 正数补码:和原码相同. 负数补码:符号位不动,反码加1. 例如5的二进制表示可以是0000010 ...
- anaconda的所有版本大全--下载地址
地址: https://repo.continuum.io/archive/ 内容: Anaconda installer archive Filename Size Last Modified MD ...
- Canvas学习笔记——动画中摩擦力的运用
摩擦力是与物体运动方向相反的力.我们在处理物体运动时,常把物体分解水平(X轴)方向和竖直(Y轴)方向的运动(比如平抛运动),但在处理摩擦力时,如果把摩擦力分解为X轴和Y轴上的阻力,就会出现某条轴上速度 ...
- SpringMVC学习(一):搭建SpringMVC-注解-非注解
文章参考:http://www.cnblogs.com/Sinte-Beuve/p/5730553.html 一.环境搭建: 目录结构: 引用的JAR包: 如果是Maven搭建的话pom.xml配置依 ...
- jave 金额科学记数法处理
金额 :amount amount.stripTrailingZeros().toPlainString();
- PHP网站加网站访问量统计
新建cnt.php <?php $n=file_get_contents('cnt.txt'); $n++; file_put_contents('cnt.txt',$n); echo &quo ...
- Oracle 一行拆分为多行
测试数据: CREATE TABLE t (str VARCHAR2(30)); INSERT INTO t VALUES ( 'X,Y,Z' ); INSERT INTO t VALUES ( 'X ...
- yii框架之gii创建数据表相应的model类
一.首先是在数据库中建立project须要的表: 二.然后,配置相应文件: 在project文件夹下yiiProject\protected\config\main.php.在50行定义了db应用组件 ...