[LUOGU] 4149 [IOI2011]Race
点分治裸题
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; inline int rd(){
int ret=,f=;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=; struct Edge{
int next,to,w;
}e[MAXN<<];
int ecnt,head[MAXN];
inline void add(int x,int y,int w){
e[++ecnt].next = head[x];
e[ecnt].to = y;
e[ecnt].w = w;
head[x] = ecnt;
} int n,m; bool vis[MAXN];
int siz[MAXN];
void getsiz(int x,int pre){
siz[x]=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==pre||vis[v]) continue;
getsiz(v,x);
siz[x]+=siz[v];
}
}
int mn,root;
void getroot(int x,int pre,int tot){
int mx=;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(v==pre||vis[v]) continue;
mx=max(mx,siz[v]);
getroot(v,x,tot);
}
mx=max(mx,tot-siz[x]);
if(mx<mn) mn=mx,root=x;
} int s[MAXN],l[MAXN],sav[MAXN];
int f[],g[];
void dfs(int x,int pre,int dis,int len){
s[++s[]]=dis;l[++l[]]=len;sav[++sav[]]=dis;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(vis[v]||v==pre) continue;
dfs(v,x,dis+e[i].w,len+);
}
} int ans=0x3f3f3f3f;
void dac(int x){
g[]=;f[]=;sav[]=;mn=n;
getsiz(x,-);
getroot(x,-,siz[x]);
int u=root;vis[u]=;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(vis[v]) continue;
l[]=;s[]=;dfs(v,x,e[i].w,);
for(int j=s[];j>=;j--){
if(s[j]>m) continue;
if(f[m-s[j]]) ans=min(ans,g[m-s[j]]+l[j]);
}
for(int j=s[];j>=;j--){
if(s[j]>m) continue;//%%%%Monster_Qi
f[s[j]]=;
g[s[j]]=min(g[s[j]],l[j]);
}
}
for(int i=sav[];i>=;i--) if(sav[i]<=m) f[sav[i]]=,g[sav[i]]=0x3f3f3f3f;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!vis[v]) dac(v);
}
} int main(){
memset(g,0x3f,sizeof(g));
n=rd();m=rd();
int x,y,w;
for(int i=;i<n;i++){
x=rd();y=rd();w=rd();
add(x,y,w);add(y,x,w);
}
dac();
if(ans>=0x3f3f3f3f) cout<<-;
else cout<<ans;
return ;
}
[LUOGU] 4149 [IOI2011]Race的更多相关文章
- 洛谷 4149 [IOI2011]Race——点分治
题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之 ...
- LUOGU P4149 [IOI2011]Race
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KKK ,且边的数量最小. 输入输出格式 输入格式: 第一行:两个整数 n,kn,kn,k . 第二至 nnn 行:每行三个整数,表示一条无 ...
- Luogu 4149 Race
Luogu 4149 Race 用点分治解决. 点分治在计算路径贡献时,为了不统计在一颗子树中的路径,解决方法一种是容斥,但在这种求最值问题中不便用容斥来撤销. 另一种则是,处理一颗子树时,只考虑前面 ...
- BZOJ 2599: [IOI2011]Race( 点分治 )
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...
- [IOI2011]Race
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem ...
- 【BZOJ2599】[IOI2011]Race 树的点分治
[BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 100000 ...
- [IOI2011]Race 点分治
[IOI2011]Race LG传送门 点分治板子题. 直接点分治统计,统计的时候开个桶维护下就好了. 注(tiao)意(le)细(hen)节(jiu). #include<cstdio> ...
- bzoj 2599 [IOI2011]Race 点分
[IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MBSubmit: 4768 Solved: 1393[Submit][Status][Dis ...
- [bzoj2599][IOI2011]Race——点分治
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所 ...
随机推荐
- layui时间控件联动:开始时间、结束时间,有效时间范围
实际开发中,经常遇到时间控件联动的情况,然后每次都网上搜代码Copy,不过每次都有点小Bug让你错不及防: 这次,在这里备份一下,以后Copy自己的得了(欢迎Copy代码,若遇到问题,请麻烦回复我一下 ...
- 初探 Nginx 架构
转载自:http://wiki.jikexueyuan.com/project/nginx/nginx-framework.html Nginx 在启动后,在 unix 系统中会以 daemon 的方 ...
- 已知单链表的数据元素为整型数且递增有序,L为单链表的哨兵指针。编写算法将表中值大于X小于Y的所有结点的顺序逆置。(C语言)
对此题目的完整示例可直接运行代码如下: #include <stdio.h> #include <stdlib.h> typedef struct LNode{ int dat ...
- IBM WebSphere MQ
相关链接: http://kakajw.iteye.com/category/269774 http://www.ibm.com/support/knowledgecenter/zh/SSFKSJ_7 ...
- CF620E New Year Tree 状压+线段树(+dfs序?)
借用学长的活:60种颜色是突破口(我咋不知道QAQ) 好像这几道都是线段树+dfs序??于是你可以把60种颜色压进一个long long 里,然后向上合并的时候与一下(太妙了~) 所以记得开long ...
- Codeforces 140C(二分、构造)
要点 可以贪心选数量最多的那三个构造 二分的话里面的check我不太会.正解是既然当前答案为\(k\)个,那每个物品最多只会出现\(k\)次,多余的丢掉,剩下的总数如果大于等于\(3k\)则true. ...
- scala worksheet demo
object worksheet_lp { println("Welcome to the Scala worksheet") //> Welcome to the Scal ...
- 收藏 SpringBoot :thymeleaf 使用详解
转载大神们笔记 --比较详细的 http://www.importnew.com/25826.html http://www.niugebbs.com/xdmrhf/1046839.html http ...
- github 新建一个分支
我能说今天在github上新建分支的时候懵逼了半天吗..为了下次不再懵逼,还是在这里记录一下吧.. 进入你的项目---code---Branch----点击那个倒三角-----你会发现一个输入框(这是 ...
- MDX分页查询
WITH SET [e16a30d0-2174-4874-8dae-a5085a75a3e2] as NONEMPTY({[Measures].[终端销售数量], [Measures].[终端销售吊牌 ...