1 条题解

  • 0
    @ 2026-7-22 21:08:00

    思路

    不难想到,因为次数有 1010010^{100},深度越深,对答案的影响越大。因为深度深的会改变深度浅的,深度浅的又会改变深度更浅的,所以我们只需要统计出每个深度的点的权值和,在按深度从深到浅,看看答案的正负,如果是正的,就输出 +,负的就输出 -,否则继续枚举。如果枚举还不能得到答案,就证明所有的点都是 0,输出 0

    实现

    #include<bits/stdc++.h>
    #define Max 250010
    #define inf 1000000000
    using namespace std;
    
    long long n,a[Max],p[Max];
    long long sum[Max],dis[Max];
    int flag;
    
    signed main(){
    	
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++){
    		scanf("%lld",&a[i]);
    		dis[i]=inf;//初始化
    	}
    	dis[1]=0;
    	for(int i=2;i<=n;i++){
    		scanf("%lld",&p[i]);
    		dis[p[i]]=i+1;//预处理深度
    	}
    	
    	for(int i=1;i<=n;i++)
    		if(dis[i]<inf)
    			sum[dis[i]]+=a[i];
    		
    	for(int i=n;~i;i--){
    		if(sum[i]>0) return printf("+"),0;
    		if(sum[i]<0) return printf("-"),0;
    	}
    	printf("0");
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    11519
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者