首页 > 其他分享 >每日一题-黑白树

每日一题-黑白树

时间:2023-05-20 20:45:13浏览次数:40  
标签:head int max 每日 黑白 tot 一题 include mx

添加链接描述

之前做过一次,好像是看别人题解的,这次自己再做一次。
考虑一个节点x需要覆盖,假设它的所有子树都已覆盖完全,那么有两种情况。
1.子树中选择的点可以覆盖x,直接覆盖即可。
2.选择的点覆盖不了x,那么这个时候我们需要选择最优的点来覆盖x。

\(f[x],g[x]\)分别表示在子树中已选择的点,和未选择的点最大能向上覆盖多少,同时统计答案即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#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 A puts("Yes") 
#define B puts("No")
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n;
int nex[N],head[N],to[N],tot;
int f[N],g[N],ans,x;
int k[N];
void add(int x,int y){
	to[++tot]=y; nex[tot]=head[x]; head[x]=tot;
}
void dfs(int x){
	int mx=-1,z=-1;
	for (int i=head[x];i;i=nex[i]){
		int v=to[i];
		dfs(v);
		mx=max(mx,f[v]);
		z=max(z,g[v]);
	}
	if (mx>=1) {
		f[x]=mx-1;
		g[x]=max(z-1,k[x]);
	}
	else{
		ans++;
		f[x]=max(k[x],z-1);
	}
}
int main(){
	
//	freopen("data.in","r",stdin);		
	
	scanf("%d",&n);
	fo(i,2,n){
		scanf("%d",&x);
		add(x,i);
	}
	
	fo(i,1,n) scanf("%d",&k[i]),k[i]--;

	
	dfs(1);
	
	printf("%d\n",ans);
	return 0;
}
  


标签:head,int,max,每日,黑白,tot,一题,include,mx
From: https://www.cnblogs.com/ganking/p/17417756.html

相关文章

  • 每日打卡,超时
    集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。输入格式:输入第一行给出两个正整数:N (≤104)是成......
  • Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
    干货!文章有点长,建议先收藏引言一、性能怪兽-Nginx概念深入浅出二、Nginx环境搭建三、Nginx反向代理-负载均衡四、Nginx动静分离五、Nginx资源压缩六、Nginx缓冲区七、Nginx缓存机制八、Nginx实现IP黑白名单九、Nginx跨域配置十、Nginx防盗链设计十一、Nginx大文件传输配置十二、Ngi......
  • 每日打卡一小时(第二十八天)
    一.问题描述定义一个空的list,将用户输入的数组a[10]的10个数插入到list中,在list头部插入数b,用迭代器遍历list并输出其中的元素值。然后将list从大到小排序,删除list尾部的元素,用迭代器遍历list并输出其中的元素值。最后将list清空。二.设计思路注意列表容器的使用方法,注意迭代器......
  • 每日总结-23.5.19
    <%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>添加用户</title><style>body{background-color:#f2f2f2;font-family:Aria......
  • 2023.5.19每日总结
    <%--CreatedbyIntelliJIDEA.User:王磊Date:2023/5/13Time:10:07TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pageimport="shiyan.student"%><%@pageimport="shiyan.AllMethods"%&g......
  • 5.19每日总结
    packageservlets;importjava.io.IOException;importjava.util.*;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet......
  • 每日总结 5.19
    今日进行了web实验。体验了新的增删改查的书写方式。packageservlets;importjava.io.IOException;importjava.util.*;importjakarta.servlet.ServletException;importjakarta.servlet.annotation.WebServlet;importjakarta.servlet.http.HttpServlet;importjakart......
  • 每日总结2023-05-19
    packageservlets;importjava.io.IOException;importjava.util.*;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet......
  • 每日打卡
    真分数序列问题问题描述:按递增序列依次排出分子小于40,分母为40的最简分数问题分析:采用穷举法,h与1中不能有40的公因数,用if判断输出代码:#include<stdio.h>intmain(){inti,h,k,j,n;printf("40之内的真分数有,\n");for(i=1;i<40;i++){           h=40;   ......
  • 每日打卡,用到了set
    如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如123和51就是朋友数,因为1+2+3=5+1=6,而6就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。输入格式:输入第一行给出正整数N。随后一......