2599: [IOI2011]Race

Time Limit: 70 Sec  Memory Limit: 128 MB
Submit: 2476  Solved: 733
[Submit][Status][Discuss]

Description

给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小.

Input

第一行 两个整数 n, k
第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始)

Output

一个整数 表示最小边数量 如果不存在这样的路径 输出-1

Sample Input

4 3
0 1 1
1 2 2
1 3 4

Sample Output

2

HINT

 

Source

 题解:
  随便点分治,用一个ans[i]代表u,v距离为k,边数为i的点对个数,那么答案就为i (ans[i]>0 && i 最小);
  怎么求ans? 自己yy一下吧
代码:
  

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define N 200100
using namespace std;
int tot,n,m,all,k,root,sum;
int pre[N*],v[N*],val[N*],now[N],size[N],ans[N],f[N];
bool vis[N];
struct data{int val,size;
}d[N],da[N];
bool cmp(data a,data b)
{
return a.val<b.val;
}
int read()
{
int x=; char ch; bool bo=;
while (ch=getchar(),ch<''||ch>'') if (ch=='-') bo=;
while (x=x*+ch-'',ch=getchar(),ch>=''&&ch<='');
if (!bo) return -x; return x;
}
void ins(int a,int b,int c)
{
++tot; pre[tot]=now[a]; now[a]=tot; v[tot]=b; val[tot]=c;
}
void getroot(int u,int fa)
{
size[u]=; f[u]=;
for (int p=now[u]; p; p=pre[p])
{
int son=v[p];
if (vis[son]||son==fa) continue;
getroot(son,u);
size[u]+=size[son];
f[u]=max(f[u],size[son]);
}
f[u]=max(f[u],all-size[u]);
if (f[u]<f[root]) root=u;
}
void getarray(int u,int fa)
{
for (int p=now[u]; p; p=pre[p])
{
int son=v[p];
if (son==fa||vis[son]) continue;
da[++sum].val=d[son].val=d[u].val+val[p];
da[sum].size=d[son].size=d[u].size+;
getarray(son,u);
} }
void calc(int u,int value, int f)
{
d[u].val=value; if (f==) d[u].size=; else d[u].size=;
sum=; da[++sum].val=value; da[sum].size=d[u].size;
getarray(u,);
sort(da+,da++sum,cmp);
for (int i=,j=sum; i<=j; i++)
{
while (j>i && da[j].val+da[i].val>k) j--;
for (int p=j; da[i].val+da[p].val==k ;p--)ans[da[p].size+da[i].size]+=f;
}
}
void solve(int u)
{
vis[u]=; calc(u,,);
for (int p=now[u]; p; p=pre[p])
{
int son=v[p];
if (vis[son]) continue;
calc(son,val[p],-);
all=size[son];
root=; getroot(son,);
solve(root);
}
}
int main()
{
n=read(); k=read();
for (int i=; i<n; i++)
{
int u=read()+,v=read()+,value=read();
ins(u,v,value); ins(v,u,value);
}
all=n; f[root=]=n; getroot(,);
solve(root);
for (int i=; i<n; i++)
{
if (ans[i])
{
printf("%d\n",i);
return ;
}
}
printf("-1\n"); return ;
}

bzoj2599的更多相关文章

  1. bzoj1758 [Wc2010]重建计划 & bzoj2599 [IOI2011]Race

    两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调 ...

  2. 【BZOJ2599】Race(点分治)

    [BZOJ2599]Race(点分治) 题面 BZOJ权限题,洛谷 题解 好久没写过点分治了... 在ppl的帮助下终于想起来了 orz ppl 首先回忆一下怎么求有没有正好是\(K\)的路径 维护一 ...

  3. 【BZOJ2599】[IOI2011]Race 树的点分治

    [BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 100000 ...

  4. [bzoj2599][IOI2011]Race——点分治

    Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...

  5. [bzoj2599][IOI2011]Race_树上点分治

    Race bzoj-2599 题目大意:询问一颗树上最短的.长度为k的链,边有边权,n个节点. 注释:$1\le n \le 2\cdot 10^5$,$1\le k \le 10^6$. 想法:树上 ...

  6. bzoj2599: [IOI2011]Race(点分治)

    写了四五道点分治的题目了,算是比较理解点分治是什么东西了吧= = 点分治主要用来解决点对之间的问题的,比如距离为不大于K的点有多少对. 这道题要求距离等于K的点对中连接两点的最小边数. 那么其实道理是 ...

  7. 【BZOJ-2599】Race 点分治

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 2590  Solved: 769[Submit][Status ...

  8. BZOJ2599 [IOI2011]Race

    传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include ...

  9. BZOJ2599——[IOI2011]Race

    0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...

  10. [BZOJ2599][Race][IOI2011]点分治

    这是为了真正去学一下点分治..然后看了迪克李的ppt 又是一道写(改)了很久的题..终于ac了 1354799 orzliyicheng 2599 Accepted 31936 kb 23584 ms ...

随机推荐

  1. 使用ReTrofit做缓存(结合上拉加载和下拉刷新)

    1. noCache 不使用缓存,全部走网络 2. noStore 不使用缓存,也不存储缓存 3. onlyIfCached 只使用缓存 4. maxAge 设置最大失效时间,失效则不使用 需要服务器 ...

  2. STL笔记之【map之添加元素】

    //---------------------------------------------------------// 向map中插入元素的方法比较//---------------------- ...

  3. Mysql命令-以NULL做where条件过滤时应该写 IS NULL;

    以NULL做where条件过滤时应该写 IS NULL;SELECT * FROM pet WHERE death IS NULL; SELECT * FROM pet WHERE death IS ...

  4. 关于svn的安装问题

    直接把安装包放在 MyEclipse的安装目录下 如果 报错 那么就重装MyEclipse 半个小时左右就OK了不然调错太浪费时间了

  5. 简单的js实现网页时钟

    js实现时钟. <div id="clock"></div> <script type="text/javascript"> ...

  6. 我有一壶酒 Android学习之Service(1)--->BinderService方式

    本文只讨论扩展Binder类 创建一个Binder.xml <?xml version="1.0" encoding="utf-8"?> <L ...

  7. Swift中异常处理(续集.正则)

    正则表达式 1.创建正则表达式的规则 let pattern = "abc" 2.创建正则表达式对象 // 方式一:try方式 do { let regex = try NSReg ...

  8. ASP.NET MVC---自定义HtmlHelper方法

    HtmlHelper方法是ASP.NET MVC中非常强大的特性,有了这个特性,我们就能更加随心所欲的定制自己的页面. 自定义自己的HtmlHelper方法通常有三种, 像是: 一.Razor语法 采 ...

  9. 【HighCharts系列教程】九、语言属性——Lang

    一.lang属性说明 Lang属性主要用于配置显示的文字等语言相关属性. 主要可配置如下内容:小数点符号.导出相关文字.月份文字.星期文字等 lang属性不重要,无特殊情况,不用配置. 二.lang属 ...

  10. 2016"百度之星" - 资格赛(Astar Round1) Problem D

    排个序,map直接搞. #include <stdio.h> #include <math.h> #include<cstring> #include<cma ...