【ybt金牌导航1-2-6】【luogu P2467】地精部落
地精部落
题目链接:ybt金牌导航1-2-6 / luogu P2467
题目大意
有一个排列,要使得每个位置要么都比两边高,要么比两边低。
而且一定要以一高一低的方式排列。
两边的只用比旁边的那个高或低就可以。
给出排列的长度 n 和模数,要你求出排列的种数在模数取模意义下的值。
思路
我们考虑设 \(f_{i,j}\) 为前 \(i\) 个数的排列,最后一个数是高的,然后是 \(j\) 会有的方案数。
那我们可以发现有几个特点:
- 高低高低和低高低高这两种形状的类型种数都是相同的。
因为你可以把 \(a_1,b_1,a_2,b_2,a_3\) 看成 \(n-a_1+1,n-b_1+1,n-a_2+1,n-b_2+1,n-a_3+1\)。
那这个既是另一种类型了。 - 如果一个排列已经是满足的了,而且 \(i\) 和 \(i+1\) 不相邻。那我们可以把他们互换,还是合法的。就因为他们不相邻,那它们就算交换了,它们还是原来的高低状态,就没有问题。
那我们可以求以高结尾的方案数,然后再输出乘 \(2\) 即可。
那怎么求高结尾的呢?
考虑根据上面的特点搞转移方程。
\(f_{i,j}=f_{i,j-1}+f_{i-1,n-j+1}\)
为什么呢?
按相不相邻来分开,不相邻的就可以交换直接形成新的波动,那就是把 \(j\) 和 \(j-1\) 交换所能有的方案数,就是 \(f_{i,j-1}\)。
那我们考虑如果相邻,是怎么样的。
那它就变成了 前 \(i-1\) 个数的排列,\(j-1\) 是最后一个,且是山谷的情况。因为这样你就可以直接让 \(j+1\sim i-1\) 的区间的数都加一(因为是相对的关系,加了之后还是满足高低关系),然后再在最后的位置把 \(j\) 插进去。
那你由前面可以知道,你前面是山谷,那你要把山谷改成山峰,那第二位就要变成 \((i-1)-(j-1)+1\),即 \(i - j+1\)。那就可以从 \(f[i-1][i-j+1]\) 转移过来。
然后你就得到了转移方程。
当然,两个 \(3500\) 的数组会炸空间,那我们观察到 \(i\) 这一维只会涉及前面的那一个,那就可以用滚动数组解决空间问题。
代码
#include<cstdio>
using namespace std;
int n, p, f[3][4201], ans;
int main() {
scanf("%d %d", &n, &p);
f[2 & 1][2] = 1;//一开始最后为高的只有这一种,初始化
for (int i = 3; i <= n; i++)
for (int j = 1; j <= i; j++) {
f[i & 1][j] = (f[i & 1][j - 1] + f[(i - 1) & 1][i - j + 1]) % p;//dp
}
for (int i = 1; i <= n; i++)
ans = (ans + f[n & 1][i]) % p;//最后可能以不同的数字结束
printf("%d", (ans * 2) % p);
return 0;
}
【ybt金牌导航1-2-6】【luogu P2467】地精部落的更多相关文章
- 【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田
优美玉米 / 方伯伯的玉米田 题目链接:ybt金牌导航1-2-5 / luogu P3287 题目大意 有一个数组,你可以每次给一个区间里面的值加一,要你使得最后剩下的最长单调不下降子序列最长. 思路 ...
- 【ybt金牌导航1-2-4】免费馅饼
免费馅饼 题目链接:ybt金牌导航1-2-4 题目大意 有一个直线,在某一个时刻有一个馅饼会出现在一些位置,有它的价值. 一个人一开始可以站在直线的任意地方,然后他每个时刻可以不移动,或向任意一边移动 ...
- 【ybt金牌导航1-2-3】折线统计
折线统计 题目链接:ybt金牌导航1-2-3 题目大意 在一个图上有一些点,保证任意两个点的横纵坐标都不相同. 要你选一些集合,按 x 坐标排序依次连接,会构成一些连续上升下降的折线,问你折线数量是 ...
- 洛谷 P2467 地精部落 解题报告
P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...
- 【题解】金牌导航-高斯消元/Luogu P3232 游走
题目描述: 详细分析: 我们对于编号的分配,很明显可以发现如下的分配就是期望最小的:对经过的期望次数越大的边赋予更小的编号. 那么问题就转化为了怎么求一条边的经过的期望次数,我们发现边数非常大所以肯定 ...
- 洛谷 P2467 地精部落 题解
题面 好难啊好难啊好难啊~(以后再玩魔兽的时候绝对绝对虐死他) 做完后总结了一下思路; 首先推一下以下三条性质: 1.若两个 i 与 i+1 不相邻,那么我们直接交换这两个数字就可以组成一个新的数列 ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
- luogu P2467 [SDOI2010]地精部落
很有意思的dp计数题目. 思考一下发现开始时山峰和开始是山谷的方案数是相同的 所以我们只需要统计一个即可. 证明的话可以考虑对于任意一种开始时山峰的方案 每个数字变成n-a[i]+1 那么可以此方案还 ...
- Luogu P2467 [SDOI2010]地精部落 | 神奇的dp
题目链接 DP 题目大意:给定一个数n,求1~n这n个整数的所有排列中有多少个波动数列,将这个数量%p后输出. 什么是波动数列呢?顾名思义,就是一个大.一个小.一个大.一个小--或者是一个小.一个大. ...
随机推荐
- 怎么判断innodb 日志缓冲区该设置为多大呢
怎么判断innodb 日志缓冲区该设置为多大呢
- service自动发现,yaml文件管理内外部端口访问
service服务发现 [root@k8s-master ~]# vim busybox-5d4f595646-dzjv4.yaml apiVersion: v1 kind: Pod metadata ...
- 通过logmnr找到被修改前的存储过程
1.找到存储过程被修改时的归档日志 SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME BETWEEN TO_DATE('20191118080000', ...
- 本地jar添加到本地仓库 本地jar依赖无效问题
最近工作发生了一个很奇怪的事情,我在本地写了一个项目,打包成jar,然后敲命令mvn install:install-file -DgroupId=com.yzwine -DartifactId=yz ...
- Android 中使用 config.gradle
各位同学大家好,当然了如果不是同学,那么大家也同好.哈哈. 大家知道config.gradle 是什么吗?我也不知道.开个完笑,其实config.gradle 就是我们为了统一gradle 中的各种配 ...
- ORB-SLAM2-tracking线程
tracking线程 Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧 ...
- 转 10 jmeter之动态关联
10 jmeter之动态关联 jmeter中关联是通过之前请求的后置处理器实现的,具体有两种方式:XPath Extractor(一般xml的时候用的多)和正则表达式提取器. 以webtours登 ...
- Java层面上下文切换
前言 在过去单CPU时代,单任务在一个时间点只能执行单一程序.之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程.虽然并不是真正意义上的"同一时间点",而是 多个任务 ...
- MySQL调优之分区表
一.分区表的应用场景 1.为什么是用分区表? 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据,分区表是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理 ...
- 对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极客公园 2018-12-01
https://mp.weixin.qq.com/s/jfHFXZpzbAEbHKkCMSev6w 对话 CTO〡用声音在一起,听荔枝 CTO 丁宁聊 UGC 声音互动平台的技术世界 原创 王颖奇 极 ...