首页 > 其他分享 >P10531 [XJTUPC2024] 圣诞树

P10531 [XJTUPC2024] 圣诞树

时间:2024-05-30 21:35:25浏览次数:23  
标签:cnt set 颜色 ll P10531 XJTUPC2024 圣诞树 include Size

题目大意

一个有 $ n $ 个节点的树,对于任意一个点 $ v $ 为根的子树如果树上的颜色 $ \ge k $ 那么就把 $ v $ 为根的子树删去答案就加一。

思路

这个地方我们第一个就会想到贪心当一颗子树颜色 $ \ge k $ 时就立马删掉这一颗树答案加一,在操作时用 set 来维护就行了。

在这我介绍一下 set:

set 是 C++ 标准库中的一个容器,属于关联容器的一种。

它是一个有序集合,其中的元素是唯一的,即每个元素只能在集合中出现一次。

set 是基于红黑树实现的合并一次的时间复杂度为 $ \Omicron(n\log n) $ 所以这道题的总时间复杂度为 $ \Omicron(n\log^2 n) $。

当你了解 set 后就可以去写代码了。代码量极少这题代码量和思路与 CF 的一道题好像啊

注意!

  1. 如果你直接去写代码会发现 MLE 所以我们需要加一个判断当 $ u $ 的儿子 $ v $ 的颜色大于 $ u $ 那么交换一下他两的颜色统计数组,但是也不能在 $ u $ 添加完 $ v $ 子树的颜色后将 $ v $ 清空因为这样会超时。

  2. 记得开 long long

  3. 记得存双边因为是树。

Code:

#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <map>
#include <set>
#define sc(ppt) scanf("%lld" , &ppt)
#define ll long long
#define prt printf
using namespace std;

const ll maxn = 2e5 + 1;
struct edge{
	ll next , to;
}e[maxn << 1]; 
ll n , k , ans = 0 , col[maxn] , h[maxn] , cnt = 0;
set<ll> Size[maxn];

inline void add_edge(ll u , ll v){
	++ cnt;
	e[cnt].next = h[u] ;
	e[cnt].to = v;
	h[u] = cnt;
} //链式前向心 

void dfs(ll u , ll fa){ // 爬树板子 
	Size[u].insert(col[u]); 
	for(ll i=h[u] ; i ; i=e[i].next){
		ll v = e[i].to;
		if(v == fa) continue;
		dfs(v , u);
		if(Size[u].size() < Size[v].size()) Size[u].swap(Size[v]); //如果v的颜色大与u颜色的数量那么就swap不然内存会超出限制而且v为子树的颜色数量也没有达到k的要求所以可以换 
		for(auto j : Size[v]){
			Size[u].insert(j);
		}
	}
	ll Sz = Size[u].size();
	if(Sz >= k){
		Size[u].clear();
		++ ans;
	}
}

signed main(){
	sc(n) ; sc(k) ;
	for(ll i=1 ; i<=n ; i++) sc(col[i]);
	for(ll i=1 ; i<n ; i++){
		ll u , v ; sc(u) ; sc(v) ;
		add_edge(u , v);
		add_edge(v , u);
	}
	dfs(1 , -1);
	prt("%lld" , ans);
	return 0;
}

标签:cnt,set,颜色,ll,P10531,XJTUPC2024,圣诞树,include,Size
From: https://www.cnblogs.com/CaoSheng-blog/p/18223267

相关文章

  • P10526 [XJTUPC2024] 命令行题解
    题目大意对于一个字符串$s$在输入的最后一行读入的字符,如个字符不为$E\(,\)T\(,\)B$那么这一个字符就添加至字符串$s$的末尾。对于操作$B$那么执行删除字符串$s$的最后一个字符,如果$s$为空那么跳过这个操作。对于操作$T$找到一个以字符串......
  • P10530 [XJTUPC2024] 生命游戏 题解
    题目大意一棵树一共$n$个点如果有$k$个点与某一个点相连那么这一轮的结尾这个点就会死。思路这道题有几个坑!并没有说哪一个节点是根节点。双向边记得开双倍数组。等这一轮的点消除完了才能再次判断哪一些点可以消除。首先我们创建一个数组$Size_{n}$来......
  • P10528 [XJTUPC2024] 崩坏:星穹铁道 题解
    头图无语了,猜猜WA哪了不要真头图崩坏:星穹铁道题链这么简单做不对不许玩崩铁!题目大意给你行动的总次数\(n\)和初始战技点数量\(k\),以及编队里四名角色的行动类型,求不同行动方式的方案数。类型如下:思路先考虑dp,分角色类型讨论。设\(f_{i,k}\)表示第\(i......
  • python代码生成圣诞树
    用turtle生成彩色圣诞树图片,有树,有雪,有星星一、简介本文将介绍如何使用Python的turtle库来生成一个彩色的圣诞树图片。我们将使用turtle库绘制树、雪花和星星,然后将其保存为图片文件。二、准备工作安装turtle库:在命令行中输入pipinstallPythonTurtle进行安装。准备一张空......
  • HTML实现圣诞树
    https://aiyc.top/Christmas-tree/Code:<!DOCTYPEHEMLPUBLIC><htmlxmlns="http://www.w3.org/1999/html"><head><metacharset="utf-8"><style>*{box-sizing:border-box;......
  • 新玩法!如何在 PieCloudDB Database 中“种”一棵圣诞树?
    随着圣诞节的到来,很多城市也都张灯结彩,处处充满了节日气息。圣诞节当然离不开圣诞树啦!和家人一起挂上圣诞装饰,树下放上互相准备的小礼物,小小的仪式感,充满了浪漫与温馨。今天,我们将教你在PieCloudDBDatabase中“种”下今年的圣诞树!就像种树前需要松土、挖种植坑,在拥有一棵圣诞树......
  • 如何用最简单的方法用html代码画出圣诞树
    一、前言在圣诞节以及元旦节日来临的日子里,如果能亲自为自己所爱的人画一个圣诞树,这肯定是个很浪漫的事。那么如何用代码画出圣诞树呢?用我的办法就能很简单的实现,复制-粘贴-......
  • Python画圣诞树看多了,挑战用C语言画一个?【圣诞快乐】
    ......
  • 圣诞树拼图游戏unity制作
    2022年圣诞节到来啦,很高兴这次我们又能一起度过~一、前言提示:使用unity来制作一个拼图游戏,图片便是圣诞树。二、创意名圣诞树拼图游戏三、效果展示圣诞树拼图游戏最终效果。......
  • 2022最炫酷的圣诞树合集(附动态效果展示和网盘源码)
    文章目录​​3D旋转水晶球(雪屋)​​​​3D旋转水晶球(圣诞树)​​​​豪华圣诞树​​​​Garland圣诞树​​​​花灯圣诞树​​​​Live圣诞树​​​​五彩圣诞树​​​​Gre......