博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【动态规划】cf1034C. Region Separation
阅读量:5316 次
发布时间:2019-06-14

本文共 944 字,大约阅读时间需要 3 分钟。

 质因数分解套路的复杂度分析的动态规划

题目大意

有一颗$n$个节点有点权的树,初始整棵树为$1$号区域,要求满足下列规则:

  • 除非$i$是最后一个等级,否则每一个$i$级区域都要被分成至少两个$i+1$级区域
  • 对于每种等级,每个点必须恰好属于一个区域
  • 一个区域的点集必须是连通的
  • 对于相同等级,每个区域必须拥有相同的点权和

问有多少种合法的划分方案,$n \le 10^6,a_i \le 10^9$.


题目分析

首先考虑判断把树分为$k$个2级区域的合法性$f_k$,记点权和为$tot$。

一种朴素的想法就是对于每一个$k$,自底向上遍历整棵树,若剩余子树大小恰好为$tot\over k$,就割去这颗子树;如果整棵树能够被处理完,$k$就是合法的。每次判定复杂度为$O(n)$.

注意到这个想法里,每次割去子树的大小$s_i$恰好是$tot\over k$的倍数;并且不难发现,$k$合法的充要条件就是恰有$k$个$s_i≡0(\text{mod }\frac{tot}{k})$。简短解释一下:对于一颗$s_i≡0(\text{mod }\frac{tot}{k})$的子树,由于它的所有子树都奉行割去$s_j≡0(\text{mod }\frac{tot}{k})$的原则,那么剩下的包括点$i$的连通块就是$i$子树内最小的$\ge {tot\over k}$的连通块。因此,$\sum [s_k≡0(\text{mod }\frac{tot}{k})] \le k$;并且当且仅当$=k$时合法。

有了这个性质,考虑如何统计$f_k$。容易发现对于合法的$k$,$\frac{tot}{k}$的任意约数$k'$都是合法的。而对于子树$s_i$,其最小有贡献的$k=\frac{tot}{\text{gcd}(s_i,tot)}$。所以这里只需要对每个$s_i$存下最小的合法$k$,再以质因数分解题的套路处理一遍就能算出$[f_k=k]$了。因此处理$f_k$的复杂度是$O(n\ln n)$。

接下去考虑dp计算把整棵树分为若干个$i$级区域的方案数$g_i$。

转载于:https://www.cnblogs.com/antiquality/p/10692714.html

你可能感兴趣的文章
UML 绘图关系
查看>>
五月28学习笔记
查看>>
洛谷P1019 单词接龙
查看>>
c++学习笔记九
查看>>
输出最大值MXNet实现
查看>>
BFS HDOJ 2102 A计划
查看>>
SQL中的left outer join,inner join,right outer join用法 (左右内连接)
查看>>
Java研发方向如何准备BAT技术面试答案(上)
查看>>
saltstack 主题说明
查看>>
服务发现与健康监测框架Consul-DNS转发的应用
查看>>
IPC之——消息队列
查看>>
.Net FrameWork
查看>>
IOS多线程
查看>>
man:命令帮助使用手册
查看>>
进程共享变量#pragma data_seg用法
查看>>
supervisord的安装使用
查看>>
趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别
查看>>
nowcoder OI 周赛 最后的晚餐(dinner) 解题报告
查看>>
javascript高级程序设计 学习笔记 第五章 上
查看>>
页面置换算法及例题
查看>>