博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】2599: [IOI2011]Race 点分治
阅读量:5890 次
发布时间:2019-06-19

本文共 1825 字,大约阅读时间需要 6 分钟。

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

【算法】点分治

【题解】每个区域按重心x划分子树,一条经过x的路径是从一个子树到另一个子树的(从x出发记为深度0即可),那么就让子树i的路径与子树1~i-1尝试合并,然后并入,这样就可以找到所有路径。

每个区域记录t[i]表示长度为i的路径最小边数,就可以过程中合并时计算答案ans = min{ ans , deep[x]+t[k-dis[x]] } 。

每个区域处理完要把t[]清空,然后再进入各个子区域。清空不能memset(否则复杂度不对),只能清空访问过的点。

复杂度O(n log n)。

#include
#include
#include
using namespace std;const int maxn=200010,maxk=1000010;int first[maxn],tot,sz[maxn],n,root,k,sum,dis[maxn],deep[maxn],ans,t[maxk],c[maxn],L,R;bool vis[maxn];struct edge{
int v,w,from;}e[maxn*2];void insert(int u,int v,int w){tot++;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}void getroot(int x,int fa){ sz[x]=1;bool ok=1; for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa&&!vis[e[i].v]){ getroot(e[i].v,x); sz[x]+=sz[e[i].v]; if(sz[e[i].v]>sum/2)ok=0; } if(sum-sz[x]<=sum/2&&ok)root=x;}void dfs(int x,int fa){ if(dis[x]>k)return; ans=min(ans,deep[x]+t[k-dis[x]]); c[++R]=x; for(int i=first[x];i;i=e[i].from)if(e[i].v!=fa&&!vis[e[i].v]){ dis[e[i].v]=dis[x]+e[i].w; deep[e[i].v]=deep[x]+1; dfs(e[i].v,x); }}void solve(int x,int s){ vis[x]=1;L=0;R=0; for(int i=first[x];i;i=e[i].from)if(!vis[e[i].v]){ deep[e[i].v]=1;dis[e[i].v]=e[i].w; dfs(e[i].v,x); for(int j=L+1;j<=R;j++)t[dis[c[j]]]=min(t[dis[c[j]]],deep[c[j]]); L=R; } for(int i=1;i<=R;i++)t[dis[c[i]]]=n; for(int i=first[x];i;i=e[i].from)if(!vis[e[i].v]){ if(sz[e[i].v]>sz[x])sum=s-sz[x];else sum=sz[e[i].v]; root=e[i].v; getroot(e[i].v,x); solve(root,sum); }}int main(){ scanf("%d%d",&n,&k); int u,v,w; for(int i=1;i
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8320128.html

你可能感兴趣的文章
webpack8--删除dist目录,压缩分离后的CSS
查看>>
微信小程序开发:http请求
查看>>
【netcore基础】.NET Core使用EPPlus实现MVC API里的Excel导出功能 配置中文表头
查看>>
对C++ templates类模板的几点补充(Traits类模板特化)
查看>>
VC++ .net 2005运行库解析
查看>>
csharp skype send message in winform
查看>>
jQuery plugin: Tablesorter 2.0
查看>>
csharp:datagridview enter Half Width and Full Width characters
查看>>
MMORPG 游戏服务器端设计--转载
查看>>
C#实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法
查看>>
[转]GetLastInputInfo计时用户离开电脑及软件在指定时间锁定等
查看>>
Windows 操作系统与 .NET Framework
查看>>
Box2dの自定义多边形
查看>>
HDU 1425 ( sort )
查看>>
Windows Phone 7 框架和页面
查看>>
Directx11教程(31) 纹理映射(1)
查看>>
Android——Button的颜色
查看>>
创建ITS mobile 应用程序步骤
查看>>
《星辰傀儡线》人物续:“灭世者”、“疯狂者”、“叛逆者”三兄妹
查看>>
安装系统字体
查看>>