参考:https://www.cnblogs.com/zhuohan123/p/3698852.html

首先,根据点到直线距离公式

\[d=\frac{kx_0-y_0+b}{\sqrt{k^{2}+1}}
\]

那么XPs的线性假设相斥度为

\[\delta =\frac{(kx_i-y_i+b)^{2}}{k^{2}+1}
\]

//以下部分为参考blog截图:





所以只需要维护\( \sum x_i , \sum y_i , \sum x_iy_i , \sum x_i^{2}, \sum y_i^{2} \)即可

注意到题目描述“使用这些跳跃星门,ZeusLeague+的物资就可以在这N个行星系中两两任意互相传输。由于经费问题,跳跃星门的个数不会超过行星系的个数。“也就是说,\( n-1\leq m\leq n \),即,可能是一棵普通树或者基环树。

然后回到树上处理,首先定一个root(假设为1),预处理出所有点到root的\( \sum x_i ,\sum y_i,\sum x_iy_i,\sum x_i^{2},\sum y_i^{2} \)

对于普通树,采用树上差分的方法,即\( \delta_x+\delta_t-\delta_{lca(x,y)}-\delta_{father(lca(x,y))} \)

对于基环树,找到环上的两个点,bfs一遍,然后当成普通树处理即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=100005;
int n,m,Q,tot,tx[N],ty[N],h[N],cnt,id[N],q[N];
int si[N],hs[N],rt[N],fa[N],de[N],fr[N];
bool vis[N];
struct qwe
{
int ne,to;
}e[N<<1];
struct dian
{
int p[10];
void add(int u,int v)
{
p[0]++;
p[1]+=u;
p[2]+=u*u;
p[3]+=v;
p[4]+=v*v;
p[5]+=u*v;
}
double wk()
{
double A=p[2]-1.0*p[1]*p[1]/p[0],B=2*p[5]-2.0*p[1]*p[3]/p[0],C=p[4]-1.0*p[3]*p[3]/p[0];
double a=4.0,b=-4.0*(A+C),c=4*A*C-B*B;
return (-b-sqrt(b*b-4*a*c))/a/2;
}
dian operator + (dian x)
{
for(int i=0;i<6;i++)
x.p[i]+=p[i];
return x;
}
dian operator - (dian x)
{
for(int i=0;i<6;i++)
x.p[i]=p[i]-x.p[i];
return x;
}
}a[N],b[N],u,v;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v)
{
tot++;
e[tot].ne=h[u];
e[tot].to=v;
h[u]=tot;
}
void dfs1(int u,int z,int fat)
{
hs[u]=0;si[u]=1;fa[u]=fat;de[u]=de[fat]+1;
vis[u]=1;rt[u]=z;
a[u]=a[fa[u]];a[u].add(tx[u],ty[u]);
for(int i=h[u];i;i=e[i].ne)
if(!vis[e[i].to]&&e[i].to!=fat)
{
dfs1(e[i].to,z,u);
si[u]+=si[e[i].to];
if(si[e[i].to]>si[hs[u]])
hs[u]=e[i].to;
}
}
void dfs2(int u,int fir)
{
fr[u]=fir;
if(hs[u])
dfs2(hs[u],fir);
for(int i=h[u];i;i=e[i].ne)
if(u==fa[e[i].to]&&e[i].to!=hs[u])//对于可能存在的环
dfs2(e[i].to,e[i].to);
}
void cir()
{
int x,y;
memset(vis,0,sizeof(vis));
for(x=1;x<=n;x++)
for(int i=h[x];i;i=e[i].ne)
if(e[i].to!=fa[x]&&fa[e[i].to]!=x)
{
y=e[i].to;
if(de[x]>de[y])
swap(x,y);
for(;y!=x;y=fa[y])
{
q[++cnt]=y;
id[y]=cnt;
vis[y]=1;
b[cnt]=b[cnt-1];
b[cnt].add(tx[y],ty[y]);
}
q[++cnt]=x;
id[x]=cnt;
vis[x]=1;
b[cnt]=b[cnt-1];
b[cnt].add(tx[x],ty[x]);
return;
}
}
int lca(int u,int v)
{
for(;fr[u]!=fr[v];de[fr[u]]>de[fr[v]]?u=fa[fr[u]]:v=fa[fr[v]]);
return de[u]<de[v]?u:v;
}
int main()
{
n=read(),m=read();
if(m<n-1)//为了测试我对题意的理解是否正确……
{
cout<<23333;
return 0;
}
for(int i=1;i<=n;i++)
tx[i]=read(),ty[i]=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y);add(y,x);
}
dfs1(1,1,0);
memset(vis,0,sizeof(vis));
if(n==m)
cir();
else
q[cnt=1]=1;
memset(fa,0,sizeof(fa));
for(int i=1;i<=cnt;i++)
{
dfs1(q[i],q[i],0);
dfs2(q[i],q[i]);
}
Q=read();
while(Q--)
{
int x=read(),y=read();
if(rt[x]==rt[y])
{
int lc=lca(x,y);
u=a[x]+a[y]-a[lc]-a[fa[lc]];
printf("%.5lf\n",u.wk());
}
else
{
if(id[rt[x]]>id[rt[y]])
swap(x,y);
u=a[x]-a[rt[x]]+a[y]-a[rt[y]]+b[id[rt[y]]]-b[id[rt[x]]-1];
v=a[x]-a[rt[x]]+a[y]-a[rt[y]]+b[id[rt[x]]]+b[cnt]-b[id[rt[y]]-1];
printf("%.5lf\n",min(u.wk(),v.wk()));
}
}
return 0;
}

bzoj 3528 [Zjoi2014]星系调查【树链剖分+数学】的更多相关文章

  1. bzoj 3528: [Zjoi2014]星系调查

    Description 银河历59451年,在银河系有许许多多已被人类殖民的星系.如果想要在行 星系间往来,大家一般使用连接两个行星系的跳跃星门.  一个跳跃星门可以把 物质在它所连接的两个行星系中互 ...

  2. bzoj 3528 [ZJOI2014] 星系调查 题解

    [原题] 星系调查 [问题描写叙述] 银河历59451年.在银河系有许很多多已被人类殖民的星系.如果想要在行 星系间往来,大家一般使用连接两个行星系的跳跃星门.  一个跳跃星门能够把 物质在它所连接的 ...

  3. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

  4. [bzoj 3531][SDOI2014]旅行(树链剖分+动态开点线段树)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3531 分析: 对于每个颜色(颜色<=10^5)都建立一颗线段树 什么!那么不是M ...

  5. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  6. BZOJ 1146: [CTSC2008]网络管理Network 树链剖分+线段树+平衡树

    1146: [CTSC2008]网络管理Network Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 870  Solved: 299[Submit] ...

  7. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  8. bzoj 3531 [Sdoi2014]旅行(树链剖分,线段树)

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 876  Solved: 446[Submit][Status][ ...

  9. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

随机推荐

  1. iOS 混合变换旋转 CGAffineTransform 的使用

    在ios 中, Core Graphics 提供了一系列的函数可以在一个变换的基础上做深层次的变换,如果做一个既要缩放又要旋转的变换,以下的方法比较实用. CGAffineTransformScale ...

  2. 蚂蜂窝VS穷游最世界-自由行类App分析

    很多其它内容请关注博客: http://www.china10s.com/blog/? p=150 一.产品概述 体验环境: 机型:iPhone 6 型号:64G版 系统:iOS9.2 蚂蜂窝APP版 ...

  3. 2014ACM/ICPC亚洲区域赛牡丹江站现场赛-I ( ZOJ 3827 ) Information Entropy

    Information Entropy Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Information ...

  4. for循环console输出结果的问题

    我想定时打印出一串数字,写好了如下代码 for (var i = 0; i < 5; i++) {   setTimeout(function () {     console.log(i); ...

  5. 网易新闻client(高仿)

    近期整理了下自己曾经做过的项目,决定分享出来.本篇所展示的是仿网易新闻client,服务端是在新浪SAE部署着的.所以大家下载后,可直接在手机上看到效果.接下来看效果图: watermark/2/te ...

  6. Android Service 不被杀死并提高优先级

    Android Service 不被杀死有两种思路,一种是将APP设置为系统应用.还有一种是增强service的生命力.即使屏幕背光关闭时也能执行. 因为设置为系统应用须要root.所以一般使用后一种 ...

  7. 2016/2/24 1,css有几种引入方式 2,div除了可以声明id来控制,还可以声明什么控制? 3,如何让2个div,并排显示。4,清除浮动 clear:left / right / both

    1,css有几种引入方式 使用HTML标签的STYLE属性 将STYLE属性直接加在单个的HTML元素标签上,控制HTML标签的表现样式.这种引入CSS的方式是分散灵活方便,但缺乏整体性和规划性,不利 ...

  8. 交换分区 在dd命令执行期间 top 其消耗系统约14%的cpu,而mem占比约为0

    [资源不友好代码] from pyltp import * d_dir = '/usr/local/ltp_data_v3.4.0/' def gen_one_sentence_part(paragr ...

  9. css class嵌套

    css 代码: <style> .chose_bonus { font-size:9px;width:400px;border: 2px solid #dddddd;margin-top: ...

  10. [JS进阶] HTML5 之文件操作(file)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/oscar999/article/details/37499743 前言 在 HTML 文档中 < ...