BZOJ2599 IOI2011Race
题目:一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小.
点分治,我们考虑经过根节点的路径,t[x]表示路径长为x时最少的边数,然后每次拿栈记下来清空。
注意先搜索再更新,这样可以避免同一子树内互相到达。
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+,inf=1e9,M=1e6+;;
int n,k,rt,cnt,head[N],s[N],f[N],t[M],ans,maxn,sta[N],top,dis[N],d[N];
bool v[N];
struct node{
int to,nex,w;
}e[N<<];
void add(int x,int y,int w)
{
e[++cnt].w=w;e[cnt].nex=head[x];e[cnt].to=y;head[x]=cnt;
}
void getrt(int x,int fa)
{
s[x]=;f[x]=;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==fa||v[y])continue;
getrt(y,x);
f[x]=max(f[x],s[y]);
s[x]+=s[y];
}
f[x]=max(f[x],maxn-s[x]);
if(f[x]<f[rt])rt=x;
}
void calc(int x,int fa)
{
if(dis[x]<=k)ans=min(ans,t[k-dis[x]]+d[x]);
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(v[y]||y==fa)continue;
dis[y]=dis[x]+e[i].w;
d[y]=d[x]+;
calc(y,x);
}
}
void update(int x,int fa)
{
if(dis[x]<=k)t[dis[x]]=min(t[dis[x]],d[x]),sta[++top]=dis[x];
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(v[y]||y==fa)continue;
update(y,x);
}
}
void work(int x)
{
v[x]=;top=;t[]=;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(v[y])continue;
dis[y]=e[i].w;d[y]=;
calc(y,x);
update(y,x);
}
for(int i=;i<=top;++i)t[sta[i]]=inf;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(v[y])continue;
maxn=s[y];rt=;
getrt(y,x);
work(rt);
}
}
int main()
{
scanf("%d%d",&n,&k);
int x,y,w;
for(int i=;i<n;++i)
{
scanf("%d%d%d",&x,&y,&w);
x++;y++;
add(x,y,w);add(y,x,w);
}
memset(t,0x3f,sizeof(t));
maxn=f[]=ans=n;
getrt(,);
work(rt);
if(ans==n)puts("-1");
else printf("%d\n",ans);
return ;
}
BZOJ2599 IOI2011Race的更多相关文章
- bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race
两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...
- 【BZOJ2599】Race(点分治)
[BZOJ2599]Race(点分治) 题面 BZOJ权限题,洛谷 题解 好久没写过点分治了... 在ppl的帮助下终于想起来了 orz ppl 首先回忆一下怎么求有没有正好是\(K\)的路径 维护一 ...
- bzoj千题计划160:bzoj2599: [IOI2011]Race
http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi # ...
- 【BZOJ2599】[IOI2011]Race 树的点分治
[BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 100000 ...
- [bzoj2599][IOI2011]Race——点分治
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...
- [bzoj2599][IOI2011]Race_树上点分治
Race bzoj-2599 题目大意:询问一颗树上最短的.长度为k的链,边有边权,n个节点. 注释:$1\le n \le 2\cdot 10^5$,$1\le k \le 10^6$. 想法:树上 ...
- bzoj2599: [IOI2011]Race(点分治)
写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...
- 【BZOJ-2599】Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 2590 Solved: 769[Submit][Status ...
- BZOJ2599 [IOI2011]Race
传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...
随机推荐
- 【BZOJ】4596: [Shoi2016]黑暗前的幻想乡
[题意]给定n个点的无向完全图,有n-1个公司各自分管一部分路,要求所有公司都有修路的生成树数.n<=17. [算法]容斥原理+生成树计数(矩阵树定理) [题解]每个生成树方案是一个公司有无修路 ...
- Metasploit 使用基础
本文将简单介绍一下Kali2 上Metasploit的一些基本使用,包括启动.更新及一个小问题"Module database cache not built yet, using slow ...
- 21、利用selenium进行Web测试
一.案例实施步骤思路分析 1.寻包 2.指定浏览器(实例化浏览器对象) 3.打开项目 4.找到元素(定位元素) 5.操作元素 6.暂停 7.关闭二.元素定位[重点] 1.id 说明:通过元素的id属性 ...
- python3爬虫.3.下载网页图片
目标,豆瓣读书, 下载页面书籍图片. import urllib.request import re #使用正则表达式 def getJpg(date): jpgList = re.findall(r ...
- MongoDB之python简单交互(三)
python连接mongodb有多种orm,主流的有pymongo和mongoengine. pymongo 安装相关模块 pip install pymongo pymongo操作 主要对象 Mon ...
- 69.Spartan-6的SelectIO资源
2.1.6 SelectIO资源 Spartan-6有丰富的I/O资源,包括SelectIO和RocketIO. Spartan-6每个I/O片(Tile)包含两个IOB.两个ILOGIC2.两个OL ...
- ProxySQL 故障
发现直接连接MGR节点是正常的,可以写入,但通过ProxySQL连接就无法show\select\insert 等 使用sysbench对ProxySQL报以下错误: FATAL: `thread_r ...
- PHP 利用nginx的X-sendfile控制下载,提高下载效率
https://blog.csdn.net/qq_34839657/article/details/52812885 https://www.jianshu.com/p/bf5c387830b7 为了 ...
- TreeSet基本用法
TreeSet的基础方法: public class TreeSetTest { public static void main(String[] args) { TreeSet nums = new ...
- 使用非root用户启动tomcat
以下操作均为以root用户运行1.添加tomcat用户组 /usr/sbin/groupadd tomcat 2.添加tomcat用户,并限制登录 /usr/sbin/useradd -s /bin/ ...