题解 ARC104F
前言
在这里首先感谢一下题解区的 FZzzz,本人的题解思路主要是基于他并给出了自己的理解。
如非特殊说明,本题解中的数学符号原则上与题目中一致。
题目分析
需要转化的喵喵题。
我们需要把原问题转化成一个图论计数问题,然后剩下的就很好办了。
好,首先让我们修改一下题目的要求,将不存在的情况设为 \(p_i = 0\),这样就可以使得我们的 \(p_i\) 的值只可能取到自然数集合中连续的一段 \([0,n-1]\) 了。
考虑连边 \((i,p_i)\),我们首先能得到一个十分显然的性质,就是最终连边连出来的图必定没有环,证明显然,考虑偏序关系不允许出现环即可。
但是这个性质不是很强,我们还可以进一步得到相比更强的性质,就是连出来的图必定是一棵树,这个证明考虑 \(p_i\) 的值只会取到 \([0,i-1]\) 而已,又因为不会出现环,故现在此时连出来的是一棵树,并且是以 \(0\) 为根节点的树。
现在让我们观察一下每个节点上 \(h_i\) 的值,不难发现兄弟之间左方的兄弟的 \(h\) 值 \(\le\) 右方的兄弟的 \(h\) 值,且当前节点的 \(h\) 值一定大于他的儿子们。证明显然,考虑如果左方的兄弟大于自己,则自己会被左方的兄弟支配,变成他的儿子,故左右兄弟之间是 \(\le\),考虑如果自己的儿子大于等于自己,那么它必定会成为自己的兄弟甚至是祖先的兄弟,故父亲儿子之间是 \(\gt\)。
让我们定义 \(a_i\) 为 \(i\) 左边第一个的兄弟,让 \(b_i\) 为 \(i\) 最右边的儿子,设 \(c_i=\max\{c_{a_i} , c_{b_i} + 1\}\),则此时 \(c\) 必定是 \(h\) 的构造方案之一(证明考虑兄弟之间的偏序关系和父亲儿子之间的偏序关系),并且对于任意的 \(h\) 我们都有 \(h_i \ge c_i\),于是可以比较 \(c_i\) 与 \(x_i\) 就可以看出 \(p\) 是否合法。
最后,设 \(dp_{i,j,k}\) 为区间 \([i-1,j]\) 形成了一棵树,且 \(c_{b_{i-1}} \le k\) 时,\([i,j]\) 的方案数,时间复杂度 \(\mathcal O(n^4)\)。
代码实现
这里只给出了代码的关键部分,其余部分还恳请读者自行实现。
int n;
int X[MAX_SIZE];
int dp[MAX_SIZE][MAX_SIZE][MAX_SIZE];
void main() {
n = read();
for (int i = 1; i <= n; i++) {
X[i] = read();
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
dp[i + 1][i][j] = 1;
}
}
for (int i = n; i >= 1; --i) {
for (int j = i; j <= n; j++) {
for (int k = 1; k <= n; k++) {
for (int p = i; p <= j; p++) {
int q = min(k, X[p]);
dp[i][j][k] =
mt.add(dp[i][j][k],
mt.mul(dp[i][p - 1][q], dp[p + 1][j][q - 1]));
}
}
}
}
printf("%lld\n", dp[1][n][n]);
return void();
}
题解 ARC104F的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- FreeSWITCH添加自定义endpoint之媒体交互
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 之前写过FreeSWITCH添加自定义endpoint的文章: https://www.cnblogs.com/ ...
- 【pandas小技巧】--字符串转数值
字符串转数字的用途和场景很多,其中主要包括以下几个方面: 数据清洗:在进行数据处理时,经常会遇到一些数据类型不匹配的问题,比如某些列中的字符串类型被误认为是数字类型,此时需要将这些字符串类型转换为数字 ...
- 一文详解自然语言处理两大任务与代码实战:NLU与NLG
自然语言处理(NLP)涵盖了从基础理论到实际应用的广泛领域,本文深入探讨了NLP的关键概念,包括词向量.文本预处理.自然语言理解与生成.统计与规则驱动方法等,为读者提供了全面而深入的视角. 作者 Te ...
- vivo 容器集群监控系统优化之道
作者:vivo 互联网容器团队 - Han Rucheng 本文介绍了vivo容器团队基于 Prometheus等云原生监控生态来构建的容器集群监控体系,在业务接入容器监控的过程中遇到的挑战.困难,并 ...
- Badusb制作,远程别人电脑
Badusb制作 插一下U盘黑一台电脑,插了我的U盘你可就是我的脑了,(▽) 理论准备 我们要用它就应该知道他的工作原理是怎么样的,方便我们去发散思维去使用它. Badusb的原理是利用HID(Hum ...
- Web服务器部署上线的踩坑流程回顾与知新
5月份时曾部署上线了C++的Web服务器,温故而知新,本篇文章梳理总结一下部署流程知识: 最初的解决方案:https://blog.csdn.net/BinBinCome/article/detail ...
- 如何将GitLab仓库同步到GitHub和Gitee?
作者:西瓜程序猿 主页传送门:https://www.cnblogs.com/kimiliucn 前言 在之前写的[Kimi.RocketMQ.NET]开源项目中,代码我是放在自己搭建的GitLab服 ...
- 2-MySQL基本语法
上文说到,数据库的安装和连接,接下来将给大家讲解MySQL数据库的基本语法及数据的类型 1.基本语法 (1).查看当前所有数据库 : show databases; (2).创建数据库 create ...
- Vue-基本语法及事件绑定
一.基本语法 v-bind绑定: 双大括号不能在 HTML attributes 中使用.想要响应式地绑定一个 attribute,应该使用 v-bind 指令 代码展示: <div id=&q ...
- Python基础——函数的理解、函数对象、函数嵌套、闭包函数、及其应用
文章目录 函数也是变量 可以赋值 可以当做函数当做参数传给另外一个函数 可以当做函数当做另外一个函数的返回值 可以当做容器类型的一个元素 函数对象应用示范 原始版 修正版 函数嵌套 函数的嵌套调用 函 ...