P1612 [yLOI2018] 树上的链 题解
思路
看到条件
所以我们记录
如何二分路径上的点呢?我们维护一个与当前 dfs 同步的栈,记录从根节点到当前节点的简单路径。二分栈里的点就行了。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,w[N],c[N],sum[N],st[N],ans[N],top;
int head[N],to[N<<1],nxt[N<<1],idx;
void add(int x,int y){to[++idx]=y,nxt[idx]=head[x],head[x]=idx;}
void dfs(int x,int fa)
{
st[++top]=x,sum[x]=sum[fa]+w[x];
int l=1,r=top;
while(l<=r)
{
int mid=(l+r)>>1;
if(sum[x]-sum[st[mid-1]]<=c[x])r=mid-1;
else l=mid+1;
}
ans[x]=max(ans[x],top-l+1);
for(int i=head[x];i;i=nxt[i])dfs(to[i],x);
top--;
}
signed main()
{
scanf("%lld",&n);
for(int i=2,x;i<=n;i++)
{
scanf("%lld",&x);
add(x,i);
}
for(int i=1;i<=n;i++)ans[i]=1;
for(int i=1;i<=n;i++)scanf("%lld",&w[i]);
for(int i=1;i<=n;i++)scanf("%lld",&c[i]);
dfs(1,0);
for(int i=1;i<=n;i++)printf("%lld ",ans[i]);
}
本文作者:Gdfzlcx
本文链接:https://www.cnblogs.com/gdfzlcx/p/17764314.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?