题目描述

小$w$在天堂看到了一棵世界树。
世界树上有$n$个节点,其中$1$节点为根,每个节点有一个正整数权值$c_i$。
现在小$w$想要对每个节点$u$求出它的祖先$v$中$\frac{c_v-c_u}{dis(u,v)}$的最小值。


输入格式

第一行一个整数$n$表示节点个数。
第二行$n$个整数,表示每个点的$c_i$。
第三行$n-1$个整数,表示$2$到$n$每个节点的父亲。


输出格式

$n-1$行,每行一个小数,表示$2$到$n$每个节点的答案,绝对值误差不超过${10}^{-6}$。


样例

样例输入:

8
31516 11930 18726 12481 79550 63015 64275 7608
1 1 2 4 2 4 5

样例输出:

19586.0000000000
12790.0000000000
-551.0000000000
-67069.0000000000
-51085.0000000000
-51794.0000000000
1440.6666666667


数据范围与提示

对于$20\%$的数据,$n\leqslant 500$。
对于$40\%$的数据,$n\leqslant 5\times {10}^4$。
对于另外$20\%$的数据,保证数据随机。
对于$100\%$的数据,$n\leqslant 5\times {10}^5,c_i\leqslant {10}^9$。


题解

$20\%$算法:

暴力枚举所有父亲,记得$double$就好啦,但是你会意外的发现你得了$50$分,为什么呢?

注意有另外$20\%$的数据为随机数据,也就意味着差不多是$\log n$层的,那么时间复杂度其实趋近于$\Theta(n\log n)$,至于另外的$10$分,那我也不知道啦。

最劣时间复杂度:$\Theta(n^2)$。

最优时间复杂度:$\Theta(n\log n)$。

期望得分:$20$分。

实际得分:$50$分。

$100\%$算法:

来化一下那个式子:$\frac{c_v-c_u}{dis(u,v)}=\frac{c_v-c_u}{dep_u-dep_v}=-\frac{c_u-c_v}{dep_u-dep_v}$。

惊喜的发现这是一个凸包,而且只用维护下凸包就好啦,但是你只能获得$80$分,为什么呢?

因为暴力弹栈最劣情况下是能把程序卡成$\Theta(n^2)$的,类似菊花图,那么怎么办呢?

考虑使用可持久化栈即可。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

$20\%$算法:

#include<bits/stdc++.h>
using namespace std;
int n;
double c[500001];
int fa[500001];
double ans[500001];
int main()
{
memset(ans,127,sizeof(ans));
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf",&c[i]);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
fa[i]=x;
}
for(int i=2;i<=n;i++)
{
int flag=i;
double dis=0.0;
while(flag!=1)
{
flag=fa[flag];
dis++;
ans[i]=min(ans[i],(c[flag]-c[i])/dis);
}
}
for(int i=2;i<=n;i++)
printf("%.8lf\n",ans[i]);
return 0;
}

$100\%$算法:

#include<bits/stdc++.h>
using namespace std;
struct rec
{
int nxt;
int to;
}e[500000];
int head[500001],cnt;
int n;
int c[500001];
int fa[500001][20];
int depth[500001];
int ans[500001];
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
double calc(int x,int y){return 1.0*(c[y]-c[x])/(depth[x]-depth[y]);}
void dfs(int x)
{
int father=fa[x][0];
for(int i=19;~i;i--)
{
if(fa[father][i]<=1)continue;
if(calc(x,fa[father][i])>=calc(x,fa[fa[father][i]][0]))father=fa[fa[father][i]][0];
}
if(father>1&&calc(x,father)>=calc(x,fa[father][0]))father=fa[father][0];
ans[x]=fa[x][0]=father;
for(int i=1;i<=19;i++)fa[x][i]=fa[fa[x][i-1]][i-1];
for(int i=head[x];i;i=e[i].nxt)
{
depth[e[i].to]=depth[x]+1;
dfs(e[i].to);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
fa[i][0]=x;
add(x,i);
}
dfs(1);
for(int i=2;i<=n;i++)printf("%.8lf\n",calc(i,ans[i]));
return 0;
}

rp++

[CSP-S模拟测试]:Lost My Music(凸包)的更多相关文章

  1. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  2. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  3. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  4. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  5. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  6. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  7. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  8. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

  9. Mac下Jmeter快速安装与入门-模拟测试Post请求及设置Http头

    [1]去Apache官网下载 Binaries系列的最新Jmeter.gz包 [2]下载到本地之后解压缩,进入到解压之后的目录然后,找到apache-jmeter-4.0/bin/jmeter.sh ...

  10. Python 的mock模拟测试介绍

    如何不靠耐心测试 可能我们正在写一个社交软件并且想测试一下"发布到Facebook的功能",但是我们不希望每次运行测试集的时候都发布到Facebook上. Python的unitt ...

随机推荐

  1. memcpy不能复制内存重叠区域,memmove可以拷贝重叠内存

    http://blog.csdn.net/li_ning_/article/details/51418400 下面s和s2指向的内存区域有重叠,memcpy不能正确复制,src赋值给dst时,可能会修 ...

  2. 5G网络的深度强化学习:联合波束成形,功率控制和干扰协调

    摘要:第五代无线通信(5G)支持大幅增加流量和数据速率,并提高语音呼叫的可靠性.在5G无线网络中共同优化波束成形,功率控制和干扰协调以增强最终用户的通信性能是一项重大挑战.在本文中,我们制定波束形成, ...

  3. JavaScript DoublyLinkedList

    function DoublyLinkedList() { var Node = function(element) { this.element = element; this.next = nul ...

  4. jvm 这我就能会了 擦

    最近老有人问jvm,恕我直言,完蛋了,不会,慢慢学吧,开始第一个学习,后续补充,走起... 我看的他的https://www.cnblogs.com/dingyingsi/p/3760447.html ...

  5. [BZOJ2438]杀人游戏

    Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, 谁是 ...

  6. P2747 [USACO5.4]周游加拿大Canada Tour

    题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边的城市,再由东向西返回,直到你回到开始的城市.除了旅 ...

  7. Day7-----Python的序列类(有子类:元组类,列表类)

    序列类型 1.基本介绍: 序列类型是一种基类类型  ,既然被称为那就肯定是有道理的,关于序列 它有  正向  和  反向  两种序号,正向序号从零开始,反向序号从负一开始 a = '例如这个字符串' ...

  8. 2.maven 安装配置

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huangbin10025/article/details/24518577  System Requ ...

  9. APM-全链路追踪

    1.故障快速定位 跨语言实现开发中在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息. 2.各个调用环节的性能分析 分析调用链的各个环节耗时,分析系统的性能瓶颈,找到系统的薄弱环节 ...

  10. 在pythonanywhere部署你的第一个应用

    pythonanywhere是一个免费的托管python的代码,可以测试你的web应用,用起来还是比较方便的,现在就来介绍如何在pythonanywhere部署你的应用. 下载你的代码 我的代码是托管 ...