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 ...
随机推荐
- Chapter 1 First Sight——18
But at least he sent me to an empty desk at the back without introducing me to the class. 但是最后他给我最后面 ...
- linux下ssh端口的修改和登录
linux下ssh端口的修改和登录 首先修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22端口,添加如下一行: Port 50000 然后保 ...
- 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换
软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...
- 货物搬运(move)
货物搬运(move) 题目描述 天地无情人有情,一方有难八方支援!汶川大地震发生后,灾区最紧缺的是救灾帐篷,全国各地支援的帐篷正紧急向灾区运送.假设围绕纹川县有环行排列的n个救灾帐篷的存储点,每个存储 ...
- ARM指令集学习总结-转载
ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方. 一.ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指 ...
- SDAU课程练习--problemE
problemE 题目描述 "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" "@ ...
- Android------>TableLayout表格布局方式
main.xml表格代码分析 <?xml version="1.0" encoding="utf-8"?> <TableLayout xmln ...
- 近期用过的Linux口令备份
最近使用Ubuntu用到的一些口令: rm -rf directory 移除文件夹或者文件touch (create file)mkdirmv(move,rename)chown (change ow ...
- HDU 5534 完全背包
Partial Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
- Fox And Names
Description Fox Ciel is going to publish a paper on FOCS (Foxes Operated Computer Systems, pronounce ...