点分治 [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的点对中连接两点的最小边数. 那么其实道理是 ...
随机推荐
- 如何突破Windows环境限制打开“命令提示符”
如今,许多企业或组织都会通过使用受限的windows环境来减少系统表面的漏洞.系统加固的越好,那么也就意味着能被访问和使用到的功能就越少. 我最近遇到的情况是,一个已经加固的系统同时受到McAfee ...
- Linux图形界面和文字界面的切换
Ctrl+Alt+F1~F6:切换到文字界面 登陆tty1~tty6终端, 运行等级为run level 3 Ctrl+Alt+F7 或者输入命令startX:切换到图形界面,运行等级为run lev ...
- POJ 1018 Communication System 题解
本题一看似乎是递归回溯剪枝的方法.我一提交,结果超时. 然后又好像是使用DP,还可能我剪枝不够. 想了非常久,无奈忍不住偷看了下提示.发现方法真多.有贪心,DP,有高级剪枝的.还有三分法的.八仙过海各 ...
- less 项目实战
1.注释 less 的注释有两种方法,"/**/" 和 "//",前一种会在 css 文件中显示,后一种不会在 css 显示. 2.定义变量的方法:" ...
- mysql用户修改登录密码及授予用户远程登录权限
一.修改用户登录密码: mysql> show databases;ERROR 1820 (HY000): You must SET PASSWORD before executing this ...
- bash 的环境配置文件
http://www.cnblogs.com/ggjucheng/archive/2012/11/01/2750179.html bash 的环境配置文件 你是否会觉得奇怪,怎么我们什么动作都没有进行 ...
- CentOS minimal 安装ssh 服务 和客户端
检查是否装了SSH包 如果现实有openssh-server 说明系统已经安装了ssh 2 如果系统没有安装ssh 那么可以在线安装 yum install openssh-server 3 设置 ...
- linux 块设备驱动(四)——简单的sbull实例
#include <linux/module.h> #include <linux/moduleparam.h> #include <linux/init.h> # ...
- iOS菜鸟学习--怎样避免两个button同一时候响应
在測试应用时.有时会变态的将两个UIButton同一时候按住来測试.结果就是两个button会同一时候响应,会出现同一时候push两个viewcontroller等非正常情况.为了避免用户误操作造成这 ...
- 官网下载kettle
首先什么是kettle,引用下百度百科 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目 ...