热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

牛客xb赛48F孤独的树树形dp处理森林筛法

题目传送门题解思路因为N最大就是1e5,所以对与每个权值他最多只能有6个不同的质因子。我们每次只能去除一个质因子,所以,如果要去除这个

题目

在这里插入图片描述
传送门


题解思路

因为N最大就是1e5,所以对与每个权值他最多只能有6个不同的质因子。
我们每次只能去除一个质因子,所以,如果要去除这个点的这种质因子就多次去除这个即可。

我们从最大的质因子不断往小删。这样就能O1获取我们此时到底要删谁。

有相同质因子的点可以构成森林(多个连通块),我们对每个连通块,每次都处理掉一种质因子,这样就能保证复杂度在Nlog(N)。

对于每个连通块处理同种质因子有树形dp来计算最小的次数,最后再累加。

dp[i][0] 表示以i为根节点的子树,根节点不进行删除操作使得满足题目条件的最小次数。

dp[i][1]就表示进行操作的最小次数。

最后在根节点取min即可。


AC代码

#include
//#include
//priority_queue
#define PII pair<int,int>
#define ll long longusing namespace std;const int INF &#61; 0x3f3f3f3f;
const int N &#61; 200100;
int a[N] ;
vector <int> head[N] ;
set <int> vis[N] ;
int f[N][3] ;
int np[N] ;
int mnp[N] ;
void si()
{for (int i &#61; 2 ; i <&#61; 1e5 &#43; 5 ; i&#43;&#43; ){if (!np[i]){for (int j &#61; i ; j <&#61; 1e5 &#43; 5 ; j &#43;&#61; i ){np[j] &#61; 1 ; mnp[j] &#61; i ; }}}
}
void dfs(int x , int p )
{vis[x].insert(p) ; int cnt &#61; 0 ; while ( a[x] % p &#61;&#61; 0 )a[x]/&#61;p,cnt&#43;&#43;;int sum1 &#61; 0 ,sum0 &#61; 0 ; for (int i &#61; 0 ; i < head[x].size() ; i&#43;&#43; ){int sk &#61; head[x][i] ;if ( !vis[sk].count(p) && a[sk] % p &#61;&#61; 0 ){dfs(sk,p) ; sum0 &#43;&#61; min(f[sk][0],f[sk][1]) ; sum1 &#43;&#61; f[sk][1] ; }}f[x][0] &#61; sum1 ; f[x][1] &#61; sum0 &#43; cnt ;
}
void solve()
{si();int n ;cin >> n ; for (int i &#61; 1 ; i <&#61; n ; i&#43;&#43; )cin >> a[i] ; for (int i &#61; 1 ; i < n ; i&#43;&#43; ){int t1 , t2 ;cin >> t1 >> t2 ; head[t1].push_back(t2) ; head[t2].push_back(t1) ; }int ans &#61; 0 ; for (int i &#61; 1 ; i <&#61; n ; i&#43;&#43; ){while ( a[i] !&#61; 1 ){int p &#61; mnp[a[i]] ; if (!vis[i].count(p)){dfs(i,p) ; ans &#43;&#61; min(f[i][1],f[i][0]) ; }}}cout << ans << "\n";
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);solve() ;return 0 ;
}

推荐阅读
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 探索1000以内的完美数:因数和等于自身
    本文探讨了如何在1000以内找到所有完美数,即一个数的因数(不包括自身)之和等于该数本身。例如,6是一个完美数,因为1 + 2 + 3 = 6。通过编程实现这一过程,可以更好地理解完美数的特性。 ... [详细]
author-avatar
夜夜0603
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有