【CF566C】Logistical Questions

题意:给你一棵n个点的树,点有点权,边有边权,两点间的距离为两点间的边权和的$3\over 2$次方。求这棵树的带权重心。

$n\le 200000$

题解:首先$y=x^{3\over 2}$是单峰的,并且两个形如$y=ax^{3\over 2}+b$的函数加起来得到的函数还是单峰的。如果在树上有两个点a和b,b有很多相邻的点,那么只有一个相邻点c满足:c到a的距离比b到a的距离短,其余的都比b长。于是我们可以得出一个当树只是一条链时的做法:

二分重心,算一下它的答案以及相邻两点的答案,取较小的那边继续二分即可。

但是放到树上呢?在树上二分?那不就是点分嘛!所以我们每次算出分治重心的答案,以及它前往每个相邻点的导数,取导数为负的那个继续点分即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
typedef long double db;
const int maxn=200010;
int n,cnt,mn,tot,rt,ans1;
db sum,sumd,ans2;
db w[maxn],val[maxn<<1],sd[maxn<<1];
int to[maxn<<1],head[maxn],nxt[maxn<<1],vis[maxn],siz[maxn];
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
void getsz(int x,int fa)
{
siz[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]) if(to[i]!=fa&&!vis[to[i]]) getsz(to[i],x),siz[x]+=siz[to[i]];
}
void getrt(int x,int fa)
{
int tmp=tot-siz[x];
for(int i=head[x];i!=-1;i=nxt[i]) if(to[i]!=fa&&!vis[to[i]]) getrt(to[i],x),tmp=max(tmp,siz[to[i]]);
if(tmp<mn) mn=tmp,rt=x;
}
void calc(int x,int y,int fa,db dep)
{
sum+=dep*sqrt(dep)*w[x],sumd+=w[x]*sqrt(dep)*3/2,sd[y]+=w[x]*sqrt(dep)*3/2;
for(int i=head[x];i!=-1;i=nxt[i]) if(to[i]!=fa) calc(to[i],y,x,dep+val[i]);
}
void dfs(int x)
{
if(vis[x]) return ;
vis[x]=1;
int i;
sum=sumd=0;
for(i=head[x];i!=-1;i=nxt[i]) sd[to[i]]=0,calc(to[i],to[i],x,val[i]);
if(sum<ans2) ans2=sum,ans1=x;
for(i=head[x];i!=-1;i=nxt[i]) if(sumd-sd[to[i]]*2<0)
{
getsz(to[i],x),tot=siz[to[i]],mn=1<<30,getrt(to[i],x),dfs(rt);
break;
}
}
inline void add(int a,int b,db c)
{
to[cnt]=b,val[cnt]=c,nxt[cnt]=head[a],head[a]=cnt++;
}
int main()
{
n=rd();
int i,a,b,c;
for(i=1;i<=n;i++) w[i]=rd();
memset(head,-1,sizeof(head));
for(i=1;i<n;i++)
{
a=rd(),b=rd(),c=rd();
add(a,b,c),add(b,a,c);
}
ans2=1e20;
getsz(1,0),tot=n,mn=1<<30,getrt(1,0),dfs(rt);
printf("%d %.10Lf",ans1,ans2);
return 0;
}

【CF566C】Logistical Questions 点分的更多相关文章

  1. CF566C Logistical Questions(10-1)

    题意 \(n\)个点的树,有点权,有边权,\(f(x)=\sum\limits_{i=1}^n w_idis(i,x)^{1.5}\),求最小的\(f(x)\)的\(x\) 单独考虑一条链,顺序编号, ...

  2. [cf566C]Logistical Questions

    记$d(x,y)$为$x$到$y$的距离,$cost_{x}=\sum_{i=1}^{n}w_{i}d(x,i)^{\frac{3}{2}}$为$x$的代价 取$C$为足够大量,对于一条边权为$w$的 ...

  3. Codeforces 566C - Logistical Questions(点分治)

    Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%% 首先考虑对这个奇奇怪怪的 \(t^{3/2}\) 进行一番观察.考虑构造函数 \(f(x)=ax^{3/2}+b(d-x) ...

  4. Diary / Solution Set -「WC 2022」线上冬眠做噩梦

      大概只有比较有意思又不过分超出能力范围的题叭.   可是兔子的"能力范围" \(=\varnothing\) qwq. 「CF 1267G」Game Relics   任意一个 ...

  5. 批判性思维——Asking The Right Questions

    我们生活在一个纷繁复杂的数字世界中,每天都在信息海洋中遨游.如果不想被其淹没,继而成为别人思想的傀儡,就有必要对你接受的信息进行批判.筛选,自己决定该相信什么不该相信什么,进而形成自己的观点,而不是一 ...

  6. ( 译、持续更新 ) JavaScript 上分小技巧(一)

    感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...

  7. 安卓面试题 Android interview questions

    安卓面试题 Android interview questions 作者:韩梦飞沙 ‎2017‎年‎7‎月‎3‎日,‏‎14:52:44 1.      要做一个尽可能流畅的ListView,你平时在 ...

  8. Some Interview Questions About Python

    一大波超链接即将袭来 Django认证流程 Python实现阶乘 Python文件处理 Python统计日志文件IP出现次数 JSON数据解析 JSON数据解析2 买卖股票的最佳时期 读取一个大文件比 ...

  9. 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说

    “笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...

随机推荐

  1. AMBA APB总线

    前面分析了AHB总线协议.接下来分析APB总线协议. (一) APB总线接口: PCLK APB总线时钟. PRESETn APB总线复位.低有效. PADDR 地址总线. PSELx 从设备选择. ...

  2. 【Spark】榨干Spark性能-driver、exector内存突破256M

    榨干Spark性能-driver.exector内存突破256M spark driver memory 256m_百度搜索 Spark executor.memory - CSDN博客 sparkd ...

  3. Eclipse 4.5.0 离线安装 Veloeclipse 插件

    下载 Veloeclipse 在 Eclipse eclipse-jee-mars-R-win32-x86_64 版本 4.5.0,Build id 为 20150621-1200,离线安装 Velo ...

  4. 为什么和什么是 DevOps?

    原文地址 本文内容 为什么 DevOps 什么是 DevOps DevOps 所带来的好处 如何将 DevOps 落到实处? 关于 DevOps 的澄清 参考资料 编写软件之所以难,是因为没有哪两个软 ...

  5. js获取客户端time,cookie,url,ip,refer,user_agent信息:

    <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> <script type=& ...

  6. 微软BI SSIS 2012 ETL 控件与案例精讲面试 200 问(SSIS 面试题,ETL 面试题)

    开篇介绍 本自测与面试题出自 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程,对于学完本课程的每一课时和阅读完相关辅助 ...

  7. linux 删除换行符

    今天需要删除文件里面的换行符,比如有一个文件a.txt: 1,2,3 4,5,6 1,2,3 4,5,6 1,2,3 4,5,6 1,2,3 4,5,6 1,2,3 4,5,6 1.使用vim删除换行 ...

  8. Android官方开发文档Training系列课程中文版:性能优化建议

    原文地址:http://android.xsoftlab.net/training/articles/perf-tips.html 本篇文章主要介绍那些能够提升总体性能的微小优化点.它与那些能突然改观 ...

  9. spring cloud配置中心属性加密处理

    在现实的场景里,我们会在配置中心配置很多中间件的账号密码(通常都是读写账号),如果采用明文存储将会有很大的风险导致账号泄露,解决方案: http://blog.didispace.com/spring ...

  10. Jmeter远程测试

    11.3 详解JMeter远程测试(1) 2012-04-09 09:14 温素剑 电子工业出版社 字号:T | T 综合评级: 想读(7)  在读(2)  已读(0)   品书斋鉴(0)   已有9 ...