【CF566C】Logistical Questions 点分
【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 点分的更多相关文章
- CF566C Logistical Questions(10-1)
题意 \(n\)个点的树,有点权,有边权,\(f(x)=\sum\limits_{i=1}^n w_idis(i,x)^{1.5}\),求最小的\(f(x)\)的\(x\) 单独考虑一条链,顺序编号, ...
- [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$的 ...
- Codeforces 566C - Logistical Questions(点分治)
Codeforces 题目传送门 & 洛谷题目传送门 神仙题 %%% 首先考虑对这个奇奇怪怪的 \(t^{3/2}\) 进行一番观察.考虑构造函数 \(f(x)=ax^{3/2}+b(d-x) ...
- Diary / Solution Set -「WC 2022」线上冬眠做噩梦
大概只有比较有意思又不过分超出能力范围的题叭. 可是兔子的"能力范围" \(=\varnothing\) qwq. 「CF 1267G」Game Relics 任意一个 ...
- 批判性思维——Asking The Right Questions
我们生活在一个纷繁复杂的数字世界中,每天都在信息海洋中遨游.如果不想被其淹没,继而成为别人思想的傀儡,就有必要对你接受的信息进行批判.筛选,自己决定该相信什么不该相信什么,进而形成自己的观点,而不是一 ...
- ( 译、持续更新 ) JavaScript 上分小技巧(一)
感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...
- 安卓面试题 Android interview questions
安卓面试题 Android interview questions 作者:韩梦飞沙 2017年7月3日,14:52:44 1. 要做一个尽可能流畅的ListView,你平时在 ...
- Some Interview Questions About Python
一大波超链接即将袭来 Django认证流程 Python实现阶乘 Python文件处理 Python统计日志文件IP出现次数 JSON数据解析 JSON数据解析2 买卖股票的最佳时期 读取一个大文件比 ...
- 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说
“笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...
随机推荐
- ReactNative: 搭建ReactNative开发环境
搭建ReactNative开发环境 不废话,具体步骤如下: 一.安装需要的软件 1.Homebrew Homebrew, Mac系统的包管理器,用于安装NodeJS和一些其他必需的工具软件. /usr ...
- UVA 10303 - How Many Trees?(数论 卡特兰数 高精度)
Problem D How Many Trees? Input: standard input Output: standard output Memory Limit: 32 MB A binary ...
- 版本控制-GitHub
前面几篇文章,我们介绍了Git的基本用法及Git服务器的搭建,本篇文章来学习一下如何使用GitHub.GitHub是开源的代码库以及版本控制库,是目前使用网络上使用最为广泛的服务,GitHub可以托管 ...
- Java多线程学习(吐血超详细总结)(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但 ...
- javascript删除数组,索引出现问题解决办法。
var data = [ { isRemove: 0, name: "项目1" }, { isRemove: 1, name: "项目2" }, { isRem ...
- webservice 配置
webservice 配置 <system.web> <!--允许GET/POST请求 --> <webServices> <protocols> &l ...
- 基于Python使用Redis的一些想法和建议
目录 1关于Redis使用的一点想法 1.1进行缓存前,需考虑 1.2进行缓存后,需考虑 1.3缓存使用一段时间后 2编写Redis数据库层规范建议 2.1选择适合的redis客户端 2.2规范化定义 ...
- 浅谈常用的几种web攻击方式
一.Dos攻击(Denial of Service attack) 是一种针对服务器的能够让服务器呈现静止状态的攻击方式.有时候也加服务停止攻击或拒绝服务攻击.其原理就是发送大量的合法请求到服务器,服 ...
- wine qq 2013 for linux deb包 Ubuntu 64位兼容
2013-08-08 Wine 1.6,如果您想体验下该版本的wine,目前可以通过ppa进行安装: sudo add-apt-repository ppa:ubuntu-wine/ppa ...
- UnDistracted for Mac(集中注意力辅助工具)破解版安装
1.软件简介 UnDistracted 是 macOS 系统上一款可以帮助我们集中注意力的辅助工具,让我们在 mac 电脑上工作更加集中注意力,提高工作效率,隐藏所有文件或是文件夹窗口.隐藏所有 ...