传送门

多明显的斜率式然而我没有看出来

然而不管是我乱搞的思路还是正解的凸包思路都需要一个可持久化栈

考场上想到可持久化单调栈,但不会实现……

其实单调栈不管是否可持久化都能倍增弹栈

但普通单调栈本来就O(n)的倍增弹栈也没啥用

  • 可持久化单调栈/队列注意要倍增处理

    这里涉及求凸包切线

    如果是个普通单调栈维护的凸包直接三分求就行

    但这里的可持久化单调栈是倍增维护的,不好三分

    所以考虑如何判断当前枚举到的点在最终答案点的哪一侧

    如果我们要check一个点v,发现在答案左侧有calc(u, fa(v))>calc(u, v),而答案右侧有calc(u, fa(v))<calc(u, v)

    就可以二分了 其实普通单调栈也可以这样避免三分

    完全想不到……

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1000100
#define ll long long
#define ld long double
#define usd unsigned
#define ull unsigned long long
#define double long double
//#define int long long #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
char buf[1<<21], *p1=buf, *p2=buf;
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} int n;
int head[N], size;
double c[N];
struct edge{int to, next;}e[N<<1];
inline void add(int s, int t) {edge* k=&e[++size]; k->to=t; k->next=head[s]; head[s]=size;} namespace force{
double ans[N];
void dfs(int u, double cv, int dis) {
if (dis) ans[u] = min(ans[u], (cv-c[u])/(1.0*dis));
for (int i=head[u]; i; i=e[i].next) dfs(e[i].to, cv, dis+1);
}
void solve() {
for (int i=1; i<=n; ++i) ans[i]=1e30;
for (int i=1; i<=n; ++i) dfs(i, c[i], 0);
for (int i=2; i<=n; ++i) printf("%.10Lf\n", ans[i]);
exit(0);
}
} namespace task{
//struct que{double c, d, k; inline void build(double c_, double d_, double k_){c=c_; d=d_; k=k_;}}sta[N][25];
int sta[N][25];
double ans[N], dep[N], reck[N];
inline double calc(int u, int v) {return (c[u]-c[v])/(dep[u]-dep[v]);}
void dfs(int u) {
//cout<<"dfs "<<u<<endl;
//cout<<"P: "<<dep[u]<<' '<<c[u]<<endl;
for (int i=1; i<=22; ++i)
if (dep[u]>=(1<<i)) sta[u][i]=sta[sta[u][i-1]][i-1];
else break;
//cout<<"sta: "; for (int t=sta[u][0]; t; t=sta[t][0]) cout<<t<<' '; cout<<endl;
if (u!=1) {
int now=u;
for (int i=22; i>=0; --i)
if (sta[sta[now][i]][0] && calc(u, sta[now][i])<calc(u, sta[sta[now][i]][0])) now=sta[now][i]; // cout<<"now: "<<now<<endl;
//while (sta[now][0] && calc(u, sta[now][0])>=k) {k=calc(u, sta[now][0]); now=sta[now][0];} //cout<<"now: "<<now<<' '<<k<<endl;
if (sta[now][0]) now=sta[now][0];
ans[u]=calc(u, now);
//cout<<"choose: "<<now<<endl;
sta[u][0]=now;
}
for (int i=1; i<=22; ++i)
if (dep[u]>=(1<<i)) sta[u][i]=sta[sta[u][i-1]][i-1];
else break;
for (int i=head[u],v; i; i=e[i].next) {
v = e[i].to;
dep[v]=dep[u]+1; sta[v][0]=u;
dfs(v);
}
//cout<<"return "<<endl;
}
void solve() {
dep[1]=1;
dfs(1);
for (int i=2; i<=n; ++i) printf("%.10Lf\n", -1.0*ans[i]);
exit(0);
}
} signed main()
{
#ifdef DEBUG
freopen("1.in", "r", stdin);
#endif n=read();
for (int i=1; i<=n; ++i) c[i]=read();
for (int i=2; i<=n; ++i) add(read(), i);
//force::solve();
task::solve(); return 0;
}

题解 Lost My Music的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. Mybatis代码自动生成(含测试)

    一.建立数据库 create database shixun; use shixun; create table user( id int primary key auto_increment , u ...

  2. 《手把手教你》系列技巧篇(八)-java+ selenium自动化测试-元素定位大法之By id(详细教程)

    1.简介 从这篇文章开始,要介绍web自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作.想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如 ...

  3. Antilibrary能拯救稍后不读吗

    从「稍后再读」到「再也不读」 上学时,我有一套自认为很高效的资料搜集工作流.大致流程是浏览到感兴趣或可能有用的信息时,粗略扫过一眼后即用 Pocket 将其保存为稍后再读,随后借助 IFTTT 的某个 ...

  4. Function.identity()

    Java 8允许在接口中加入具体方法.接口中的具体方法有两种,default方法和static方法,identity()就是Function接口的一个静态方法.Function.identity()返 ...

  5. 算法leetcode_分治算法

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...

  6. mybatis-5-关联查询

    外键查询 1.回忆外键约束 注意要在tbl_dept中添加外键 #添加外键约束 # 此处Employee为外键表,dept为主键表 # 删除Employee的数据不会影响dapt,而删除dept一定会 ...

  7. Redis介绍及使用(八)

    一.什么是Redis 1.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.(非关系型缓存数据库) 2.五种数据类型: 3.支持持久化. 参看链接:https:// ...

  8. 第十篇 -- Windows 下免费的GIF录制工具

    网址:https://blog.csdn.net/u013019701/article/details/80550411 本人用的第二个,亲测好用.

  9. Linux开机以root账户自动登录

    最近我们的自动化测试平台需要支持中标麒麟系统,对于我们来说要让这个系统支持分布式自动化测试,最重要的一点就是虚拟机启动后自动以root账户登录系统,并且执行我们的环境配置脚本,那么如何能让它开启自动登 ...

  10. 冒泡排序(bubble_sort)——Python实现

      # 冒泡排序 # 作用:对给出的n个顺序不定的数进行排序 # 输入:任意数组A # 输出:按顺序排列的数组A   # 冒泡排序过程 # 第一趟:以第一个数为基准,从最后一位数开始,依次与它比较, ...