正解:点分治

解题报告:

传送门$QwQ$

昂先不考虑关于那个长度的限制考虑怎么做?

就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$

然后现在考虑加入这个长度的限制?就考虑把这个桶,本来是个$bool$数组记录可行嘛,现在就改成$int$数组记录最小长度

然后就做完辣,,,?$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=+,M=+,inf=1e9;
int n,K,head[N],ed_cnt,mxsz[N],sum,sz[N],rt,as,cnt,dis1[N],dis2[N],stp[M];
bool vis[N];
struct ed{int to,nxt,wei;}edge[N<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z){edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;}
void dfs(ri x,ri fa)
{
sz[x]=;mxsz[x]=;
e(i,x)if(t(i)^fa && !vis[t(i)])dfs(t(i),x),sz[x]+=sz[t(i)],mxsz[x]=max(mxsz[x],sz[t(i)]);
mxsz[x]=max(mxsz[x],sum-sz[x]);if(mxsz[x]<mxsz[rt])rt=x;
}
void dfs2(ri x,ri fa,ri d1,ri d2)
{if(d1>K)return;dis1[++cnt]=d1,dis2[cnt]=d2;e(i,x)if(!vis[t(i)] && t(i)^fa)dfs2(t(i),x,d1+w(i),d2+);}
il void cal(ri x)
{
stp[]=;cnt=;
e(i,x)
{
if(!vis[t(i)])
{
ri tmp=cnt;dfs2(t(i),x,w(i),);
rp(j,tmp+,cnt){as=min(as,dis2[j]+stp[K-dis1[j]]);/*printf("x=%d to=%d dis1j=%d dis2j=%d stp=%d len=%d\n",x,t(i),dis1[j],dis2[j],stp[K-dis1[j]],K-dis1[j]);*/}
rp(j,tmp+,cnt)stp[dis1[j]]=min(stp[dis1[j]],dis2[j]);
}
}
//printf(" x=%d as=%d\n",x,as);
rp(i,,cnt)stp[dis1[i]]=stp[K+];
}
void solv(ri x){/*printf("rt=%d\n",x);*/vis[x]=;cal(x);e(i,x)if(!vis[t(i)])sum=sz[x],rt=,dfs(t(i),x),solv(rt);} signed main()
{
//freopen("4149.in","r",stdin);freopen("4149.out","w",stdout);
n=read();K=read();rp(i,,n-){ri x=read()+,y=read()+,z=read();ad(x,y,z);ad(y,x,z);}
mxsz[rt]=sum=n;dfs(,);memset(stp,,sizeof(stp));as=stp[];solv(rt);printf("%lld\n",as==stp[K+]?-:as);
return ;
}

洛谷$P4149\ [IOI2011]\ Race$ 点分治的更多相关文章

  1. [洛谷P4149][IOI2011]Race

    题目大意:给一棵树,每条边有边权.求一条简单路径,权值和等于$K$,且边的数量最小. 题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前 ...

  2. 模板—点分治B(合并子树)(洛谷P4149 [IOI2011]Race)

    洛谷P4149 [IOI2011]Race 点分治作用(目前只知道这个): 求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数. 算 ...

  3. 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小

    P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...

  4. 洛谷 4149 [IOI2011]Race——点分治

    题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之 ...

  5. 洛谷P4149 [IOI2011]Race(点分治)

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK ,且边的数量最小. 输入输出格式 输入格式:   第一行:两个整数 n,kn,k . 第二至 nn 行:每行三个整数,表示一条无向边的 ...

  6. P4149 [IOI2011]Race

    对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...

  7. P4149 [IOI2011]Race 点分治

    思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双 ...

  8. LUOGU P4149 [IOI2011]Race

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KKK ,且边的数量最小. 输入输出格式 输入格式: 第一行:两个整数 n,kn,kn,k . 第二至 nnn 行:每行三个整数,表示一条无 ...

  9. 洛谷 P4149 [ IOI 2011 ] Race —— 点分治

    题目:https://www.luogu.org/problemnew/show/P4149 仍然是点分治: 不过因为是取 min ,所以不能用容斥,那么子树之间就必须分开算,记录桶时注意这个: 每次 ...

随机推荐

  1. 自定义View系列教程08--滑动冲突的产生及其处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  2. redhat6.5安装oracle11_2R

    参照前人一步一步操作: http://leihenzhimu.blog.51cto.com/3217508/1685164 遇到如下错误: This is a prerequisite conditi ...

  3. oracle函数 LPAD(c1,n[,c2])

    [功能]在字符串c1的左边用字符串c2填充,直到长度为n时为止 [参数]C1 字符串 n 追加后字符总长度 c2 追加字符串,默认为空格 [返回]字符型 [说明]如果c1长度大于n,则返回c1左边n个 ...

  4. [ZJOI2007] 小Q的矩阵游戏 (模板—Dinic)

    B. 矩阵游戏 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行 ...

  5. 6、mysql的安装

    1.安装mysql-Server,并输入root密码 sudo apt-get install mysql-server 2.安装mysql客户端 sudo apt-get install mysql ...

  6. Laravel实现定时任务的示例代码

    https://mp.weixin.qq.com/s/VUEqjwcHRb0ovhP0wup36A 最近在玩Laravel实现定时任务,这个是示例代码,可以参照这个实例.有需要的可以看看 定时任务是后 ...

  7. apply、call、bind方法调用

    ---恢复内容开始--- 首先这三个方法的作用都是用来改变this的值,而this的值一般有几种情况. 1.函数作为一个对象的一个方法来调用,此时this的值指向对象. var a={ v:0; f: ...

  8. display常用的三种值:block、inline、inline-block

    display:block(块级元素 ) 会独占一行,多个block元素会各自新起一行.默认情况下,block元素宽度自动填满其父级宽度 display:inline(内联(行级)元素 ) 不会独占一 ...

  9. zoj 3652 Maze

    Maze Time Limit: 2 Seconds      Memory Limit: 65536 KB Celica is a brave person and believer of a Go ...

  10. POJ 2251宽搜、

    因为这个题做了两次犯了两次不同的错误. 第一次用的dfs死活都超时 第二次把定义队列定义在了全局变量的位置,导致连WA了几次.最后找到原因的我真的想一巴掌拍死自己 #include<cstdio ...