【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. Cocos2d-x 3.x游戏开发之旅 笔记

    #include "HelloWorldScene.h"#include "SimpleAudioEngine.h"#include "MyHello ...

  2. Mysql高效插入/更新数据

    从tushare抓取到的财务数据,最开始只是想存下来,用的办法想简单点,是:插入--报错-update 但发现这个方法太蠢,异常会导致大量无效连接,改为: for idx,row in d2.iter ...

  3. Emoji 编码

    https://segmentfault.com/a/1190000007594620 http://cenalulu.github.io/linux/character-encoding/ http ...

  4. PL/SQL学习笔记之函数

    一:函数 函数与过程的最大不同就是,函数有返回值.适用于需要返回结果的场景. 二:创建函数 CREATE [OR REPLACE] FUNCTION function_name [(parameter ...

  5. android makefile文件批量拷贝文件的方法

    该方法是shell 和makefile组合使用 wallpapers := $(shell ls packages/apps/hyst_apps/NewBingoLauncher_C/default_ ...

  6. 20151028整理罗列某种开发所包括对技术(技术栈),“较为全面”地表述各种技术大系的图表:系统开发技术栈图、Web前端技术栈图、数据库技术栈图、.NET技术栈图

    ———————————— 我的软件开发生涯 (10年开发经验总结和爆栈人生) 爆栈人生 现在流行说全栈.每种开发都有其相关的技术.您是否觉得难以罗列某种开发所包括对技术(技术栈)呢?   您是否想过: ...

  7. JavaScript中的namespace

    <head> <title> New Document </title> <script> var global = window.global||{} ...

  8. OpenCV 学习笔记 05 级联分类器CascadeClassifier类

    在人脸检测中,CascadeClassifier 是一个类,该类的作用是(基于官方已经训练好的数据文件 .xml)实例化一个检测器. 1 类 CascadeClassifier 的概述 首先看一下该类 ...

  9. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  10. 物联网架构成长之路(20)-申请免费SSL证书

    0.前言 今天域名备案申请下来了,接下来就是申请个SSL证书,现在普通的网站没有SSL都不好意思见人了.可是稍微好点的企业级SSL证书还是比较贵的.不过还好有免费的可以用.只不过要定时去续时间.这个不 ...