bzoj 2599: [IOI2011]Race【点分治】
点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p])
这里注意更新和初始化的时候不能对整个mn操作,这样时间复杂度是错的,要开一个栈存一下更新了哪些点,只初始化这些点即可
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1000005;
int n,m,h[N],cnt,rt,sz,si[N],mx[N],de[N],s[N],top,ans=1e9,mn[N],d[N],tot;
long long dis[N];
bool v[N];
struct qwe
{
int ne,to,va;
}e[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
e[cnt].va=w;
h[u]=cnt;
}
void gtrt(int u,int fa)
{
si[u]=1;
mx[u]=0;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa&&!v[e[i].to])
{
gtrt(e[i].to,u);
si[u]+=si[e[i].to];
mx[u]=max(mx[u],si[e[i].to]);
}
mx[u]=max(mx[u],sz-si[u]);
if(mx[u]<mx[rt])
rt=u;
}
void gtde(int u,int fa)
{
de[u]=de[fa]+1;
if(dis[u]<=m)
s[++top]=u;
for(int i=h[u];i;i=e[i].ne)
if(e[i].to!=fa&&!v[e[i].to])
{
dis[e[i].to]=dis[u]+e[i].va;
gtde(e[i].to,u);
}
}
void wk(int u)
{//cerr<<u<<endl;
tot=0;
v[u]=1;
mn[0]=0;
for(int i=h[u];i;i=e[i].ne)
if(!v[e[i].to])
{
top=0;
dis[e[i].to]=e[i].va;
gtde(e[i].to,0);
for(int j=1;j<=top;j++)
ans=min(ans,de[s[j]]+mn[m-dis[s[j]]]);
for(int j=1;j<=top;j++)
mn[dis[s[j]]]=min(mn[dis[s[j]]],de[s[j]]),d[++tot]=dis[s[j]];
}
ans=min(ans,mn[m]);
for(int i=1;i<=tot;i++)
mn[d[i]]=1e9;
for(int i=h[u];i;i=e[i].ne)
if(!v[e[i].to])
{
sz=si[e[i].to],rt=0;
gtrt(e[i].to,0);
wk(rt);
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<n;i++)
{
int x=read()+1,y=read()+1,z=read();
add(x,y,z),add(y,x,z);
}
for(int i=0;i<=m;i++)
mn[i]=1e9;
sz=mx[0]=n;
gtrt(1,0);
wk(rt);
printf("%d\n",ans==1e9?-1:ans);
return 0;
}
bzoj 2599: [IOI2011]Race【点分治】的更多相关文章
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)
题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...
- bzoj 2599 [IOI2011]Race 点分
[IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 4768 Solved: 1393[Submit][Status][Dis ...
- bzoj 2599 [IOI2011]Race (点分治)
[题意] 问树中长为k的路径中包含边数最少的路径所包含的边数. [思路] 统计经过根的路径.假设当前枚举到根的第S个子树,若x属于S子树,则有: ans<-dep[x]+min{ dep[y] ...
- BZOJ 2599 [IOI2011]Race【Tree,点分治】
给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- 【刷题】BZOJ 2599 [IOI2011]Race
Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...
- BZOJ 2599: [IOI2011]Race
点分治,定权值,求另一关键字最小 不满足前缀加减性 可以按序遍历,用一数组$t[] 来维护路径为i的最小边数$ 再对于一个直系儿子对应的子树,先算距离求答案再更新$t数组,这样就不会重复$ #incl ...
- 2599: [IOI2011]Race
2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...
随机推荐
- Frame Relay - 简单介绍及基本配置
Frame Relay如今越来越不流行了,只是在过去的设计中被广泛应用. 所以工作上还是能常常见到的, 这篇博文从二层简单总结下FR的一些概念 在介绍Frame Relay之前,先了解下广播介质和非广 ...
- Apatch常用的commons工具包介绍
1.Commons BeanUtils http://jakarta.apache.org/commons/beanutils/index.html 说明:针对Bean的一个工具集.由于Bean往往是 ...
- Tomcat的虚拟主机的配置
比如:配置一个虚拟主机的名字是www.sina.com 1 改动window系统中的HOST文件[C:\WINDOWS\system32\drivers\etc\hosts] 127.0.0.1 ...
- 关于JAVA中的前期绑定 后期绑定(动态绑定)
前期绑定,在程序执行前根据编译时类型绑定,调用开销较小,如C语言只有前期绑定这种方法调用. 后期绑定,是指在运行时根据对象的类型进行绑定,又叫动态绑定或运行时绑定.实现后期绑定,需要某种机制支持,以便 ...
- C/S转分布式数据库的解决方法
C/S转分布式数据库的解决方法1. 直接VPN建一个网不就行了.(大概是虚拟成一个网络)2. 直连也可以,就是速度慢3. 还是三层吧,推荐RTC4. 弄个花生壳硬件试试呢,成本低,不用改程序5. 搞一 ...
- 自制简单的range(Vue)
废话不多说先上成果图 实现思路 主要分界面与逻辑两大块 界面分为5个部分 左滑块长度 左内容位置 中间长度 右滑块长度 右内容位置 逻辑 touch3个事件 各滑块长度及位置计算 选中时变色 具体实现 ...
- HDU3507 Print Article —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others) Mem ...
- WinDbg设置托管进程断点
WinDbg的Live模式调试..Net 托管代码 ,使用bp,bu,bm无法设置断点,也许是我不会.研究了下,托管代码有自己的命令,!BPMD 模块名 完全限定的方法名 步骤: 1.查找进程PID, ...
- java 正则表达式 -Regular Expression
正则表达式(Regular Expression),可以说就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式.正则表达式定义了字符串的模式,可以用来搜索.编辑或处理文本,不仅限于某一种语言(P ...
- iOS NSInteger/NSUInteger与int/unsigned int、long/unsigned long之间的区别!
在iOS开发中经常使用NSInteger和NSUInteger,而在其他的类似于C++的语言中,我们经常使用的是int.unsigned int.我们知道iOS也可以使用g++编译器,那么它们之间是否 ...