【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. mysql 时间类型精确到毫秒、微秒及其处理

    一.MySQL 获得毫秒.微秒及对毫秒.微秒的处理 MySQL 较新的版本中(MySQL 6.0.5),也还没有产生微秒的函数,now() 只能精确到秒. MySQL 中也没有存储带有毫秒.微秒的日期 ...

  2. Android -- 再来一发Notification

    之前写过一个Notificaiton的文章,用上面的方式去操作也是OK的,但是到后面的SDK之后,有些方法被弃用,甚至我到SDK23的时候,我发现有些方法直接没了,所以在这里重新写一下最新的用法. h ...

  3. 基于redis 实现分布式锁(二)

    https://blog.csdn.net/xiaolyuh123/article/details/78551345 分布式锁的解决方式 基于数据库表做乐观锁,用于分布式锁.(适用于小并发) 使用me ...

  4. Data Structure Visualizations

    https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  5. linux达人养成计划学习笔记(七)—— 用户登录查看命令

    一.查看用户登录信息 1.命令格式 w 2.命令结果 第一行信息是:系统当前时间     系统运行总时间     登录用户数量     一分钟/五分钟/十分钟的系统负载(越大越差) 二.who命令 1 ...

  6. [Aaronyang] 写给自己的WPF4.5 笔记11[自定义控件-AyImageButton的过程 1/4]

    我的文章一定要对读者负责-否则不是好文章  ----       www.ayjs.net  aaronyang技术分享 文章导航: 介绍vs2013 WPF开发,属性代码相关技巧 实战AyImage ...

  7. apache的性能调配 MaxClients 与MaxRequestsPerChild

    因近期服务不稳定,现象和这个比较类似http://hi.baidu.com/xinfeng999/blog/item/1aea470e214ab1cd7acbe1ed.html根据现象来对APACHE ...

  8. oradim新建服务后,登录数据库报ORA-12560错误

    > oradim -new -sid mydb 实例已创建. > sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on 星期二 ...

  9. MySQL -- Innodb中的change buffer

    change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...

  10. ARM与X86 CPU架构对比区别

    CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是  CISC要用最少的机器语言 ...