题解 \(by\;zj\varphi\)

一道凸包的题

设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) 这个式子可以维护一个下凸包

但是递归弹栈的话会被卡成 \(n^2\),所以我们可以写一个可持久化栈,或者是倍增跳栈

对于一个新加入的节点,我们对比它和不同祖先的斜率,如果有一个祖先 \(fa\),\(\rm slope(x,fa)\le slope(x,fa[fa])\),那么就说明,我们要把 \(fa\) 这里的栈跳掉

Code
  1. #include<bits/stdc++.h>
  2. #define ri register signed
  3. #define p(i) ++i
  4. using namespace std;
  5. namespace IO{
  6. char buf[1<<21],*p1=buf,*p2=buf;
  7. #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
  8. template<typename T>inline void read(T &x) {
  9. ri f=1;x=0;register char ch=gc();
  10. while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
  11. while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
  12. x=f?x:-x;
  13. }
  14. }
  15. using IO::read;
  16. namespace nanfeng{
  17. #define FI FILE *IN
  18. #define FO FILE *OUT
  19. template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
  20. template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
  21. typedef double db;
  22. static const int N=5e5+7;
  23. int dep[N],c[N],first[N],fa[N][20],ch[N],n,t=1;
  24. struct edge{int v,nxt;}e[N];
  25. inline void add(int u,int v) {e[t].v=v,e[t].nxt=first[u],first[u]=t++;}
  26. inline db calc(int x,int y) {return (1.0*(c[y]-c[x]))/(1.0*(dep[x]-dep[y]));}
  27. void dfs(int x) {
  28. ri ft=fa[x][0];
  29. for (ri i(19);~i;--i) {
  30. if (fa[ft][i]<=1) continue;
  31. if (calc(x,fa[fa[ft][i]][0])<=calc(x,fa[ft][i])) ft=fa[fa[ft][i]][0];
  32. }
  33. if (ft>1&&calc(x,fa[ft][0])<=calc(x,ft)) ft=fa[ft][0];
  34. ch[x]=fa[x][0]=ft;
  35. for (ri i(1);i<=19;p(i)) fa[x][i]=fa[fa[x][i-1]][i-1];
  36. for (ri i(first[x]),v;i;i=e[i].nxt) dep[v=e[i].v]=dep[x]+1,dfs(v);
  37. }
  38. inline int main() {
  39. // FI=freopen("nanfeng.in","r",stdin);
  40. // FO=freopen("nanfeng.out","w",stdout);
  41. read(n);
  42. for (ri i(1);i<=n;p(i)) read(c[i]);
  43. for (ri i(2),u;i<=n;p(i)) read(u),add(fa[i][0]=u,i);
  44. dfs(1);
  45. for (ri i(2);i<=n;p(i)) printf("%.10lf\n",calc(i,ch[i]));
  46. return 0;
  47. }
  48. }
  49. int main() {return nanfeng::main();}

NOIP 模拟 $16\; \rm Lost My Music$的更多相关文章

  1. NOIP 模拟 $16\; \rm God Knows$

    题解 \(by\;zj\varphi\) 对于这道题,不难想到可以用 \(dp\),就是求一个最小权极长上升子序列 设 \(dp_i\) 表示最后一个选 \(i\) 时,覆盖前 \(i\) 条边的最小 ...

  2. NOIP 模拟 $16\; \rm Star Way To Heaven$

    题解 \(by\;zj\varphi\) 看懂题!!! 从最左穿到最右,一定会经过两个星星之间或星星和边界之间,那么我们穿过时当前最优一定是走中点 而我们要求最小的距离最大,那么我们将所有星星和边界( ...

  3. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  4. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  5. NOIP 模拟 $22\; \rm f$

    题解 \(by\;zj\varphi\) 对于一个数,如果它二进制下第 \(i\) 位为 \(1\),那么 \(\rm x\) 在这一位选 \(1\) 的贡献就是和它不同的最高为为 \(i\) 的数的 ...

  6. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...

  7. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  8. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  9. 20190725 NOIP模拟8

    今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...

随机推荐

  1. Oracle_RAC共享存储

    <<ASM.sh>> 第2-3步可以使用"附件ASM.sh"脚本执行 此操作说明,此操作在2个节点都执行(可以复制) 编辑/etc/scsi_id.conf ...

  2. F5的IPv6配置指导

    1.配置核心思想: 配置IPv6的默认路由 配置IPv6的VS IPv6的vs里面要启用"automap" 2.配置IPv6的默认路由 3.配置IPv6的VS 第一种方法: 第二种 ...

  3. kali中设置共享文件夹

    1.在虚拟机设置共享目录 2.查看共享目录命令 root@kali:~# vmware-hgfsclient 3.新建文件夹 root@kali:~# mkdir /mnt/hgfs/ShareDir ...

  4. CF1539C Stable Groups[题解]

    Stable Groups 题目大意 给定 \(n\) 个数 \(a_i\) ,你可以将这些数分成若干组,但每一组的元素满足按升序排列后,相邻两个元素值的差不超过 \(x\) .在分组前,你可以向这些 ...

  5. 【记录】如何造一个vite插件(2)

    上一篇已经把vite插件的基础结构搭建起来了,这一次就来聊聊继续完善开发环境. 完善开发环境 生成d.ts文件 先来修改一下lib/index.ts这个文件 export interface user ...

  6. 前端开发入门到进阶第四集【使用sublime安装jshint和cssLint】

    参考:https://blog.csdn.net/qq_27965129/article/details/52786224 使用sublime安装JSHint插件: 1,解决不能使用package c ...

  7. 传统.NET 4.x应用容器化体验(5)

    前面几篇都是基于阿里云ECS直接玩的,有童鞋问直接用Windows Server 2019可以玩不,本篇就为你介绍一下如何给Windows Server 2019配置Docker环境. 1 准备工作 ...

  8. [考试总结]noip模拟9

    因为某些原因,咕掉了一段时间 所以现在才更新 T1 斐波那契 一看就是规律 然而我选择了暴力 其实完全可以打表去找规律. 然后就可以发现父亲的顺序也是斐波那契. 就这 #include<bits ...

  9. odoo里面的read_group写法

    #计算数task_count = fields.Integer(compute='_compute_task_count', string="Task Count")def _co ...

  10. Matplotlib不能显示中文和正负号的问题

    参考链接:https://www.jianshu.com/p/240ea3ae0dc9 在使用matplotlib画饼状图时,遇到了如下问题 UserWarning: findfont: Font f ...