博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Luogu3806]点分治
阅读量:6090 次
发布时间:2019-06-20

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

询问树上是否存在距离为k[i]的点对

直接点分治把所有距离预处理出来,然后O(1)回答即可

Code

#include 
#include
#define N 10010using namespace std;const int mx=N*1000;struct info{int to,nex,w;}e[N<<1];int n,m,tot,head[N],Ans[mx],sz[N],rt,d[N],sum,f[N];bool vis[N];void Link(int u,int v,int w){ e[++tot].to=v,e[tot].w=w,e[tot].nex=head[u];head[u]=tot;}inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}void getrt(int u,int fa){ sz[u]=1,f[u]=0; for(int i=head[u];i;i=e[i].nex){ int v=e[i].to; if(v==fa||vis[v]) continue; getrt(v,u); sz[u]+=sz[v]; f[u]=max(f[u],sz[v]); } f[u]=max(f[u],sum-sz[u]); if(f[rt]>f[u]) rt=u;} void getdep(int u,int fa,int dep){ d[++d[0]]=dep; for(int i=head[u];i;i=e[i].nex){ int v=e[i].to; if(v==fa||vis[v]) continue; getdep(v,u,dep+e[i].w); }}void calc(int u,int f,int pre){ d[0]=0; getdep(u,0,0); for(int i=1;i<=d[0];++i) for(int j=i+1;j<=d[0];++j) if(f&&d[i]+d[j]<=mx) ++Ans[d[i]+d[j]]; else if(d[i]+d[j]+pre<=mx) --Ans[d[i]+d[j]+pre];}void solve(int u){ calc(u,1,0); vis[u]=1; for(int i=head[u];i;i=e[i].nex){ int v=e[i].to; if(vis[v]) continue; calc(v,0,e[i].w*2); sum=sz[v]; getrt(v,rt=0); solve(rt); }}int main(){ n=read(),m=read(); for(int i=1;i

 

转载于:https://www.cnblogs.com/void-f/p/9105732.html

你可能感兴趣的文章
PHP 文件处理
查看>>
cesium之核心类Viewer简介篇
查看>>
ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
查看>>
libev与libuv的区别
查看>>
iOS 为什么使用xcode8上传app包到appStore无法构建版本
查看>>
Tomcat优化步骤【转】
查看>>
CRC 自动判断大端 小端
查看>>
原来这样可以轻松恢复回收站删除文件
查看>>
DisparityCostVolumeEstimator.cpp
查看>>
(转)git中关于fetch的使用
查看>>
mongo DB for C#
查看>>
caffe整体框架的学习的博客,这个博客山寨了一个caffe框架
查看>>
git只拉取github部分代码的方法
查看>>
[LeetCode] Construct Quad Tree 建立四叉树
查看>>
如何避免SHRINKDATABASE & SHRINKFILE 产生索引碎片(转载)
查看>>
【SSH网上商城项目实战02】基本增删查改、Service和Action的抽取以及使用注解替换xml...
查看>>
高阶函数简述 js
查看>>
Java CompletableFuture:allOf等待所有异步线程任务结束
查看>>
Highmaps网页图表教程之图表配置项结构与商业授权
查看>>
mysql 5.6.33发布
查看>>