首页 > 其他分享 >P1612 [yLOI2018] 树上的链 题解

P1612 [yLOI2018] 树上的链 题解

时间:2023-10-14 16:22:18浏览次数:27  
标签:二分 int 题解 yLOI2018 P1612 sum 节点

思路

看到条件 \(2\),我们得知:这个节点对应的最长链,一定在这个节点到根节点的简单路径上。
所以我们记录 \(1\) 到 \(i\) 之间的权值和,记为 \(sum_i\)。因为权值是正整数,所以满足单调性,可以二分。

如何二分路径上的点呢?我们维护一个与当前 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]);
}

标签:二分,int,题解,yLOI2018,P1612,sum,节点
From: https://www.cnblogs.com/gdfzlcx/p/17764314.html

相关文章

  • [ARC116C] Multiple Sequences题解
    思路我们可以很好的想到一种\(O(nm)\)的dp:状态:\(dp_{i,j}\)为搜到第\(i\)个,最后一个数是\(j\)的方案数。转移:\(dp_{i,j}=\displaystyle\sum_{k|j,k\not=j}dp_{i-1,k}\)当然这是会超时的。我们换一种思路,我们先枚举最后一个数,再计算方案数。这有个好处,我们缩小......
  • 苏格拉底问答、实践过程截图、遇到问题解决问题截图,代码链接
    defineVOLUME_NAME"EXT2FS"//卷名#defineBLOCK_SIZE512//块大小#defineDISK_SIZE4612//磁盘总块数defineDISK_START0//磁盘开始地址#defineSB_SIZE32//超级块大小是32BdefineGD_SIZE32//块组描述符大小是32B#defineGDT_START(0+512)//块组描述......
  • Android项目在 app 中通过 WebView 访问 url显示空白,使用浏览器可以打开,Android WebVi
    这是服务器证书校验WebView的安全问题服务器证书校验主要针对WebView的安全问题。在app中需要通过WebView访问url,因为服务器采用的自签名证书,而不是ca认证,使用WebView加载url的时候会显示为空白,出现无法加载网页的情况。使用ca认证的证书,在WebView则可以直接......
  • 网络规划设计师真题解析--PERT “计划评审技术”(三点估算法)
    某网络建设项目的安装阶段分为A、B、C、D四个活动任务,各任务顺次进行,无时间上重叠,各任务完成时间估计如下图所示,按照计划评审技术,安装阶段工期估算为(70)天。(2019年)(70)A.31   B.51    C.53    D.83答案:C解析:依据三点估算公示,活动历时均值=(最悲观时间+最可能时间*4+......
  • 算法题解——多数元素
    题目给定一个大小为n的数组nums,返回其中的多数元素。多数元素是指在数组中出现次数大于⌊n/2⌋的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例1:输入:nums=[3,2,3]输出:3示例2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==nums.length......
  • [AGC009B] Tournament 题解
    思路考虑树形\(\text{dp}\)。我们将每个人与把自己淘汰的人连边。得到一颗以一为根的树。由于我们需要求出必须赢的场数最多的那位选手,至少要赢多少场。考虑最多的限制。可以使用树型动态规划。每一次两个人比赛的代价为:\[dp_i=\max(dp_i,dp_j)+1\]这样就达成了最多的限......
  • 题解:CF118E
    Tarjan思路先来看一下题目给出的无解的这个样例。不难发现,导致无解的两条边就是\(6-7\)和\(2-4\)这两个桥。所以这个题就转换成了求桥,如果存在桥就是无解。代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5,M=3e5+5;inlineintread();intn,......
  • [AGC037D] Sorting a Grid 题解
    学长给我看了这道题,感觉很有趣啊!想了想想出来了。考虑先把每个数还原到对应行上,然后用最后一次把它们斗出来。那么我们就是要在第一次操作后,对于每种颜色使得它平铺在这个块上。那么我们直接网络流或二分图匹配构造一下方案就做完力!......
  • Codeforces 512D. Fox And Travelling 题解
    FoxAndTravelling题面翻译给定一张\(n\)个点\(m\)条边的无向图。一个点只有当与它直接相连的点中最多只有一个点未被选择过时才可被选择。询问对于每个\(k\in[0,n]\),有序选择\(k\)个点的方案数。\(n\le100\),\(m\le\frac{n(n-1)}2\),答案对\(10^9+9\)取模。......
  • 洛谷P9290 [ROI 2018] Decryption 题解
    include<bits/stdc++.h>pragmaGCCoptimize(1)pragmaGCCoptimize(2)pragmaGCCoptimize(3,"Ofast","inline")defineregregisterdefineintlonglongusingnamespacestd;inlineintread(){shortf=1;intx=0;charc=getchar();......