[IOI2011]Race 点分治
[IOI2011]Race
点分治板子题。
直接点分治统计,统计的时候开个桶维护下就好了。
注(tiao)意(le)细(hen)节(jiu)。
#include<cstdio>
#include<cctype>
#include<cstring>
#define R register
#define I inline
using namespace std;
const int S=200003,N=400003,K=1000003,inf=0x3f3f3f3f;
char buf[1000000],*p1,*p2;
I char gc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,S,stdin),p1==p2)?EOF:*p1++;}
I int rd(){
R int f=0; R char c=gc();
while(c<48||c>57) c=gc();
while(c>47&&c<58) f=f*10+(c^48),c=gc();
return f;
}
struct D{int l,d;}p[S];
int h[S],s[N],g[N],w[N],t[S],v[S],q[S],a[K],c,n,k,u,r,e,o;
I int min(int x,int y){return x<y?x:y;}
I int max(int x,int y){return x>y?x:y;}
I void add(int x,int y,int z){s[++c]=h[x],h[x]=c,g[c]=y,w[c]=z;}
void gts(int x,int f){t[x]=1;
for(R int i=h[x],y;i;i=s[i]) if(!v[y=g[i]]&&y^f) gts(y,x),t[x]+=t[y];
}
void gtr(int x,int f,int a){R int i,y,m=0;
for(i=h[x];i;i=s[i]) if(!v[y=g[i]]&&y^f) gtr(y,x,a),m=max(m,t[y]);
m=max(m,a-t[x]); if(m<u) u=m,r=x;
}
void dfs(int x,int f,int l,int d){
if(d>k) return ; p[++e]=(D){l,d},q[++q[0]]=d;
for(R int i=h[x],y;i;i=s[i]) if(!v[y=g[i]]&&y^f) dfs(y,x,l+1,d+w[i]);
}
void dac(int x){R int i,j,y;
for(q[0]=0,u=n,gts(x,0),gtr(x,0,t[x]),v[r]=1,a[0]=0,i=h[r];i;i=s[i])
if(!v[y=g[i]]){e=0,dfs(y,r,1,w[i]);
for(j=1;j<=e;++j) o=min(o,p[j].l+a[k-p[j].d]);
for(j=1;j<=e;++j) a[p[j].d]=min(a[p[j].d],p[j].l);
}
for(i=1;i<=q[0];++i) a[q[i]]=inf;
for(i=h[r];i;i=s[i]) if(!v[y=g[i]]) dac(y);
}
int main(){
R int i,x,y,z;
for(n=rd(),k=rd(),i=1;i<n;++i) x=rd()+1,y=rd()+1,z=rd(),add(x,y,z),add(y,x,z);
o=inf,memset(a,0x3f,sizeof a),dac(1);
o^inf?printf("%d",o):printf("-1");
return 0;
}
[IOI2011]Race 点分治的更多相关文章
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- [bzoj2599][IOI2011]Race——点分治
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...
- bzoj2599/luogu4149 [IOI2011]Race (点分治)
点分治.WA了一万年. 重点就是统计答案的方法 做法一(洛谷AC bzojWA 自测WA): 做点x时记到x距离为k的边数最小值为dis[k],然后对每一对有值的dis[i]和dis[K-i],给an ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- 洛谷 4149 [IOI2011]Race——点分治
题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之 ...
- P4149 [IOI2011]Race 点分治
思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双 ...
- 洛谷$P4149\ [IOI2011]\ Race$ 点分治
正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这 ...
- bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)
题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...
- BZOJ2599:[IOI2011]Race(点分治)
Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...
随机推荐
- 使用泛型和内部静态类实现栈(FILO,先进后出)
package tuple; /** * 泛型实现的栈,FILO * @author Youjie * * @param <T> */ public class LinkedStack&l ...
- hbase性能调优(1)
hbase性能调优 标签: hbase 性能调优 | 发表时间:2014-05-17 15:10 | 作者:无尘道长 分享到: 出处:http://www.iteye.com 一.服务端调优 1.参数 ...
- Gradle初步
一.介绍 Gradle是一个基于 JVM 的富有突破性构建工具. 它为您提供了: 一个像 ant 一样,通用的灵活的构建工具 一种可切换的,像 maven 一样的基于约定优于配置的构建框架 强大的多工 ...
- Unity3D-制作火焰效果
1.插件的准备 随着官网上的迭代更新,连下载按钮都找了好久,今天制作的火焰效果要依赖一个插件,LowPoly Environment Pack 输入网址unity3d.com在Assert Store ...
- idea 和 maven学习
创建maven项目:http://www.cnblogs.com/wql025/p/5215570.html
- 获取url中?后面传递的参数
function getUrlArgs(){ var url=location.href; var i=url.indexOf('?'); if(i==-1)return; var querystr= ...
- #leetcode刷题之路23-合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2- ...
- [译文]程序员能力矩阵 Programmer Competency Matrix
注意:每个层次的知识都是渐增的,位于层次n,也蕴涵了你需了解所有低于层次n的知识. 计算机科学 Computer Science 2n (Level 0) n2 (Level 1) n (Leve ...
- flask中请求勾子
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: *在请求开始时,建立数据库连接; *在请求开始时,根据需求进行权限校验; *在请求结束时,指定数据的交互格式; 为了让每 ...
- 可编辑div中包含子元素时获取光标位置不准确的问题
前言: 高亮显示输入框中的关键字符,这就必须得用到可编辑div(或其他标签)元素了,这时我们需要获取光标的位置,以便插入字符. 正文: 正常情况下获取光标位置,代码如下: function getPo ...