点分治模板

#include<cstdio>
#include<algorithm>
using namespace std;
int cnt,n,K,ans,N,root,F_top,last[1000005],sz[1000005],F_[1000005],vis[1000005],F_stack[1000005],G_stack[1000005],F[1000005],G[1000005];
struct node{int to,next,val;
}e[1000005];
void add(int a,int b,int c){e[++cnt].to=b;e[cnt].next=last[a];e[cnt].val=c;last[a]=cnt;
}
void find_root(int x,int fa){sz[x]=1,F_[x]=0;for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (V==fa || vis[V]) continue;find_root(V,x);sz[x]+=sz[V];F_[x]=max(F_[x],sz[V]);}F_[x]=max(F_[x],N-sz[x]);if (F_[x]<F_[root]) root=x;
}
void get_dis(int x,int fa,int val,int dep){sz[x]=1;if (val==K) ans=min(ans,dep);if (val<=K) F_stack[++F_top]=val;if (val<=K) F[val]=min(F[val],dep);for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (vis[V] || V==fa) continue;get_dis(V,x,val+e[i].val,dep+1);sz[x]+=sz[V];}
}
void solve(int x){int G_top=0;for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (vis[V]) continue;F_top=0;get_dis(V,x,e[i].val,1);for (int j=1; j<=F_top; j++) ans=min(ans,F[F_stack[j]]+G[K-F_stack[j]]);for (int j=1; j<=F_top; j++) G[F_stack[j]]=min(G[F_stack[j]],F[F_stack[j]]),F[F_stack[j]]=1e9,G_stack[++G_top]=F_stack[j];}for (int i=1; i<=G_top; i++) G[G_stack[i]]=1e9;
}
void divide(int x){vis[x]=1;solve(x);for (int i=last[x]; i; i=e[i].next){int V=e[i].to;if (vis[V]) continue;N=sz[V],root=0;find_root(V,x);divide(root);}
}
int main(){scanf("%d%d",&n,&K);for (int i=1; i<n; i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);x++,y++;add(x,y,z);add(y,x,z);}for (int i=1; i<=K; i++) F[i]=G[i]=1e9;ans=1e9;N=n,root=0;F_[0]=1e9;find_root(1,0);divide(root);if (ans!=1e9) printf("%d\n",ans);else printf("-1\n");return 0;
}

  

转载于:https://www.cnblogs.com/silenty/p/9783939.html

BZOJ 2599: [IOI2011]Race相关推荐

  1. bzoj 2599: [IOI2011]Race(树的点分治)

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MB Submit: 3862  Solved: 1144 [Submit][Sta ...

  2. BZOJ 2599: [IOI2011]Race 点分治题解

    Time Limit: 70 Sec Memory Limit: 128 MB Submit: 3811 Solved: 1129 Description 给一棵树,每条边有权.求一条简单路径,权值和 ...

  3. 【BZOJ】2599: [IOI2011]Race 点分治

    [题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...

  4. [BZOJ2599][IOI2011]Race 点分治

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MB Submit: 3934  Solved: 1163 [Submit][Sta ...

  5. P4149 [IOI2011]Race

    P4149 [IOI2011]Race 题意: 给一棵树,每条边有权.求一条简单路径,权值和等于 k,且边的数量最小. 题解: 用t[i]:长度为i的路径包含的最少边数 按照子树顺序,依次用dep[u ...

  6. bzoj 2600: [Ioi2011]ricehub

    2600: [Ioi2011]ricehub Description 乡间有一条笔直而长的路称为"米道".沿着这条米道上 R 块稻田,每块稻田的坐标均 为一个 1 到 L 之间(含 ...

  7. [IOI2011]Race

    题目链接:点这里 Solution: 点分治,算出点对之间的距离,记录所属子树和与跟之间的边数. 对于每个点,记录排序过后位置离自己最近的不同子树的点,记做go[x] 每次二分去更新,若遇到同一子树的 ...

  8. 【P4149 [IOI2011]Race】点分治

    P4149 给一棵树,每条边有权.求一条简单路径,权值和等于 K,且边的数量最小. 输入格式 第一行包含两个整数 n, K. 接下来 n - 1 行,每行包含三个整数,表示一条无向边的两端和权值. 注 ...

  9. 一句话题解(20180210~)

    2.9 BZOJ 2006 [NOI2010]超级钢琴.这道题目几天之前就做了.做法是固定右端点,左端点在ST表上走,走法其实就是笛卡尔树的走法.完结撒花! BZOJ 1218 [HNOI2003]激 ...

最新文章

  1. 1.8 其他正则化方法-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  2. 阿里再推社交“Real如我”,是电商巨头的流量焦虑
  3. C/C++之数据类型
  4. VTK:PolyData之MergePoints
  5. poj2479与poj2593 , 同一道DP题
  6. My FioriTest navigation from master page to detail page
  7. “Mom, isn‘t Su Ruoxia coming back today?
  8. HDU2014 青年歌手大奖赛_评委会打分【入门】
  9. android Fragment详解三:实现Fragment的界面
  10. MATLAB曲线拟合函数
  11. YYKit(Base模块)学习笔记
  12. 描述性统计分析案例题_SPSSAU描述性分析指标如何选择?
  13. matlab增加一行ones,MATLAB repmat()、ones()、zeros()、prod()函数的使用
  14. 海信在CES宣布推出75英寸到100英寸的全系全色激光电视产品
  15. 使用 Piral 创建微前端
  16. 文件包含漏洞——实例
  17. 今日头条(layout下xml布局)
  18. 【大数据开发】SparkCore——利用广播变量优化ip地址统计、Spark2.x自定义累加器
  19. mac u盘只读怎么修改_U盘插到苹果电脑总是只读 请问mac系统怎么设置U盘读写权限?...
  20. 识别12306验证码脚本

热门文章

  1. SpringBoot启动类的扫描注解的用法及冲突原则
  2. 大数据笔记2019.5.10
  3. 机器学习基础专题:支持向量机SVM
  4. Oracle+jsp+Servlet的员工表的简单增删改查
  5. 原生 js 上传图片
  6. 18.11 LVS DR模式搭建 18.12 keepalived + LVS
  7. Python学习笔记之基本数据结构方法
  8. 【Git】git使用 - 各种常用场景命令解决
  9. DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习
  10. Gdiplus中实现双Buffer绘图