【JZOJ 5403】 Lost My Music

5 篇文章 0 订阅
4 篇文章 0 订阅

Description

这里写图片描述
n<=5105ci<=109

凸壳

将dis(u,v)写成dep[u]-dep[v],这就是个斜率的形式
手动脑补一下可以发现我们只需要用单调栈维护根到当前点u的一个凸壳,即可算出答案
暴力弹栈,暴力加入复杂度是O(n^2)的,我们需要优化

倍增

记录每个点在凸壳上的前一个点,于是我们不需要暴力弹栈,可以倍增二分判断
成功将复杂度优化为O(nlogn)
貌似呢这种姿势,其实就是可持久化栈

Code

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,b,a) for(int i=b;i>=a;i--)
#define efo(i,v,u) for(int i=last[v],u=to[i];i;i=next[i],u=to[i])
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
using namespace std;
typedef long long ll;
typedef double db;
char ch;
void read(int &n)
{
    n=0;int p=1;
    for(ch=getchar();ch<'0' || ch>'9';ch=getchar())
        if(ch=='-') p=-1;
    for(;'0'<=ch && ch<='9';ch=getchar()) n=n*10+ch-'0';
    n*=p;
}
const int N=5e5+5;
int n,tot,to[N+N],next[N+N],last[N],c[N],d[N],fa[N];
void link(int u,int v){to[++tot]=v,next[tot]=last[u],last[u]=tot;}
int pre[N][22];
db ans[N];
queue<int> q;
bool bz[N];
db xl(int i,int j)
{
    return 1.0*(c[i]-c[j])/(d[j]-d[i]);
}
void bfs()
{
    q.push(1);
    while(!q.empty())
    {
        int v=q.front();q.pop();
        d[v]=d[fa[v]]+1;
        int x=fa[v];
        fd(j,20,0)
            if(pre[pre[x][j]][0] && xl(pre[pre[x][j]][0],pre[x][j])<xl(pre[x][j],v)) x=pre[pre[x][j]][0];
        if(pre[x][0] && xl(pre[x][0],x)<xl(x,v)) x=pre[x][0];
        pre[v][0]=x;
        fo(j,1,20) pre[v][j]=pre[pre[v][j-1]][j-1];
        ans[v]=xl(pre[v][0],v);
        efo(i,v,u) q.push(u);
    }
}
int main()
{
    freopen("lost.in","r",stdin);
    freopen("lost.out","w",stdout);
    read(n);
    fo(i,1,n) read(c[i]);
    fo(i,2,n) read(fa[i]),link(fa[i],i);
    bfs();
    fo(i,2,n) printf("%.10lf\n",ans[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Connection lost是指连接丢失或中断。这可能是由于多种原因引起的。引用中提到,可能出现连接失败的原因可能是错误代码为10058。然而,具体的原因没有给出。 在引用中,提到了一种可能的解决方案是使用mysql自带的无动作自动关闭机制。通过在代码中重新创建连接来解决连接中断的问题。 另外,在引用中,也提到了一些其他的解决方法,但都没有取得有效的结果。最终,他们通过卸载完全Beyond Compare,并重新安装来解决了连接丢失的问题。 综上所述,Connection lost是指连接丢失或中断的情况。解决方法可以包括重新创建连接、尝试其他解决方法或重新安装相关软件。具体解决方法需要根据具体情况而定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Beyond Compare 连接失败: Connection lost (error code is 10058)](https://blog.csdn.net/m0_37594653/article/details/113319938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [解决nodejs的Connection lost: The server closed the connection](https://blog.csdn.net/anwen743680/article/details/114916451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值