bzoj2599
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
0 1 1
1 2 2
1 3 4
Sample Output
HINT
Source
#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的更多相关文章
- 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\)的路径 维护一 ...
- 【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 ...
- BZOJ2599——[IOI2011]Race
0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的 ...
- [BZOJ2599][Race][IOI2011]点分治
这是为了真正去学一下点分治..然后看了迪克李的ppt 又是一道写(改)了很久的题..终于ac了 1354799 orzliyicheng 2599 Accepted 31936 kb 23584 ms ...
随机推荐
- magento head.phtml 加载<a target=_parent
<script language="javascript">function alinks(){ var links = document.getElementsBy ...
- hdu_5145_NPY and girls(莫队算法+组合)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5145 题意:给你n,m,共有n个女孩,标号为1—n,n个数xi表示第ith个女孩在第xi个教室,然后下 ...
- 第20章 数据库操作----JDBC概述
JDBC是一种可用于执行SQL语句的Java API(Application Programming Interface,应用程序设计接口),是连接数据库和Java应用程序的纽带. 1.JDBC-OD ...
- Servlet程序开发-- 过滤器
3种servlet:简单Servlet,过滤Servlet,监听Servlet 1. 简单Servlet:是作为一种程序所必须的开发结构保存下来的. 2. 过滤Servlet:过滤器使用的不是Http ...
- [转]异常:android.os.NetworkOnMainThreadException
Android 4.1项目:使用新浪微博分享时报: android.os.NetworkOnMainThreadException 网上搜索后知道是因为版本问题,在4.0之后在主线程里面执行Http请 ...
- extjs最普通的grid
的 <script> Ext.onReady(function () { //1.定义Model Ext.define("MyApp.model.User", { ex ...
- 获取一个gridcontrol的数据行数
((DataTable)gc_excel.DataSource).Rows.Count;
- iOS JsonModel
iOS JsonModel 的使用 本文转自:http://blog.csdn.net/smking/article/details/40432287 下面讲一下JSONModel的使用方法. @in ...
- Cocos2dx 3.1.1 学习笔记整理(2):创建场景与载入图片
把之前用2.2.3的代码迁移到3.1.1真是个蛋疼的工作,话说3.1.1做的改动还真是大啊. 可以在HelloWorldScene.cpp中看到,之前的各种CCXXX都被废弃了. 例如,新建一个CCL ...
- nexus 中央仓库
nexus 中央仓库 下载地址:http://www.sonatype.org/nexus/archived 下载最新版本 mkdir -p /opt/local/nexus tar zxvf nex ...