概述
题意:给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000
明显点分治,但是愚蠢的我并没有想到怎么分治。。%hzwer。
开一个t[i]表示整棵树中权值和为i的路径有多少条,那么我们分治每一颗树的时候,再算出子节点到当前根的dis[x]权值距离和d[x]点数距离,然后就可以直接更新了ans=min(ans,t[k-dis[x]]+d[x]);
然后再更新dis和d,因为如果先更新了就会算重,有一种情况,即起点终点在子树内但是经过了根,这样就会算重复了。。
注意inf设小一点,不然会爆int。。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
const int N=4e5+5;
const int M=1e6+5;
最后
以上就是伶俐荷花为你收集整理的bzoj2599: [IOI2011]Race 点分治的全部内容,希望文章能够帮你解决bzoj2599: [IOI2011]Race 点分治所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复