[SDOI2010]地精部落解题报告

2024-03-10 19:38
文章标签 报告 解题 部落 sdoi2010

本文主要是介绍[SDOI2010]地精部落解题报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题是我看了题解以后才做出来的,真是一道神题,但是写题解的大神都不愿解释得太详细,所以我想了很久才想明白。。

看了题解以后真的觉得很像数的划分、约瑟夫问题还有国王游戏,代码出奇地简洁,但是思维量相当地高。

主要思路:离散。

三个引理:

①在n->n-1的转化过程中,我们删除了一个点后,我们可以将n-1个点视为仍是1~n-1的排列。

②在若排列Pn为一个合法抖动子序列,则交换i∈[1,n)与i+1,必能得到另一个抖动子序列。

③抖动序列的对称性,若存在第一段上升的长度为n的抖动子序列,则以n+1-x代x必能得到一个第一段下降的长度为n的抖动子序列。

设f[i][j]为长度为i的,以j开头的,第一段下降的抖动子序列的个数,则循题意可得2*f[n+1][n+1]即为答案。

考虑转移:

①若j的下一个是j-1,则需要一个长度为n-1的,以j-1开头的上升子序列;

再分两种情况:

若j==n,则j-1为i-1中正数第一个数,所以可以转移到f[i][1];

若j<n,则j-1为i-1中正数第i-1-(j-1)+1-1个数,所以可转移到f[i-1][j-i].

我们根据状态设定,显然有f[i][0]=f[i][1]=0.

∴f[i][j]->f[i-1][j-i].

②若j的下一个不是j-1,则对于任意一个以j-1开头的下降子序列,均可以通过交换j-1和j+1得到。

∴f[i][j]->f[i][j-1]

综,f[i][j]=f[i-1][j-i]+f[i][j-1].

减少代码量?一个技巧:

改变状态,令f[i][j]=f[i+1][j+1],则初始状态变更为f[1][1]=1,i∈[1,n],j∈[1,n].

#include<iostream>
using namespace std;
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
int f[2][10001];
int main(){int n,p;bool tmp;scanf("%d%d",&n,&p);f[1][1]=1;for(int i=2;i<=n;++i){tmp=i&1;for(int j=1;j<=i;++j)f[tmp][j]=(f[!tmp][i-j+1]+f[tmp][j-1])%p;}printf("%d",(f[tmp][n]<<1)%p);
}



两年后再来做这道题——这是什么奇怪的做法嘛!

完全可以令f[i][j][k]表示1~i在最终的排列中被分成j段,两边有k个是上升的。

那么新加入一个i+1,可以加在两边,或者新建一段,或者连接两段——就这么无脑!


而且吐槽一下两年前的我,是不是看题解看懵逼了,第一个做法感觉完全可以暴力枚举下一位然后前缀和优化一下就行了嘛。。。并不需要考虑太复杂。

#include<cstdio>
#include<iostream>
using namespace std;
const int N=4200+5;
typedef long long LL;
int f[N][N][3];
int main()
{freopen("codevs1523.in","r",stdin);freopen("codevs1523.out","w",stdout);int n,p;scanf("%d%d",&n,&p);f[1][1][0]=1;for(int i=1;i<n;++i)for(int j=min(i,n-i+1);j;--j)for(int o=3;o--;)if(f[i][j][o]){//printf("f(%d,%d,%d)=%d\n",i,j,o,f[i][j][o]);if(j>1)f[i+1][j-1][o]=(f[i+1][j-1][o]+(LL)f[i][j][o]*(j-1))%p;f[i+1][j+1][o]=(f[i+1][j+1][o]+(LL)f[i][j][o]*(j+1-o))%p;if(o<2)f[i+1][j][o+1]=(f[i+1][j][o+1]+(LL)f[i][j][o]*(2-o))%p;}printf("%d\n",((f[n][1][0]+f[n][1][1])%p+f[n][1][2])%p);
}


这篇关于[SDOI2010]地精部落解题报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795312

相关文章

芯片后端之 PT 使用 report_timing 产生报告如何阅读

今天,就PT常用的命令,做一个介绍,希望对大家以后的工作,起到帮助作用。 在PrimeTime中,使用report_timing -delay max命令生成此报告。switch -delay max表示定时报告用于设置(这是默认值)。 首先,我们整体看一下通过report_timing 运行之后,报告产生的整体样式。 pt_shell> report_timing -from start_

android反馈Crash报告

此文章转载他人,担有所改动,,在全局获取异常有所改动 为什么需要反馈Crash报告?   做Android应用程序,要尽量避免程序Crash的发生。虽然说零Crash是程序员追逐的最终目标,但是现实的情况是,程序员只能尽量的减少Crash的发生,而几乎不可能完全杜绝Crash。也许,你认为你的应用的健壮性已经近乎完美,轻松的经受住了测试部门魔鬼般的考验,但是当你的应用发布到市

用R Markdown 生成数据分析报告

为了创建 R Markdown报告,打开text文件,并将它保存为.Rmd 文件。File > New File > Text File 确保保存成 .Rmd文件, RStudio IDE能够很大程度上帮助你完成整个任务.,你可以保存通过File > Save。修改扩展名。 R Markdown 报告由一下3部分组成: text文本 knitr 处理 R code YAML的

杭电ACM hdu 2110 Crisis of HDU 解题报告(母函数)

Problem Description 话说上回讲到HDU大战东洋小苟,结果自然是中方大胜,这一战也使得海东集团在全球同行业中的地位更加巩固。随着集团的发展,很多创业时期的元老逐步功成身退,先是8600移民海外,然后是linle夫妇退隐山林,逐渐的,最初众多的元老只剩下XHD夫妇和Wiskey三人了。 到了2020年,因为扩张过度加上老鼠数量逐年减少,公司的发展遇到了前所未有的危机,此时集团已经

杭电ACM hdu 2082 找单词 解题报告(母函数)

Problem Description 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,..... 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如

杭电ACM hdu 2079 选课时间 解题报告(母函数)

Problem Description 又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合。你来帮帮他吧。(xhd认为一样学分的课没区别)   Input 输入数据的第一行是一个数据T,表示有T组数据。 每组数据的第一行是两个整数n(1 <= n <= 40),k(1 <= k <= 8)。 接着有k行,每行有两个整数a(1 <= a <= 8),b

【洛谷P3366】【模板】最小生成树 解题报告

洛谷P3366 -【模板】最小生成树 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz。 输入格式 第一行包含两个整数 N , M N,M N,M,表示该图共有 N N N 个结点和 M M M 条无向边。 接下来 M M M 行每行包含三个整数 X i , Y i , Z i X_i,Y_i,Z_i Xi​,Yi​,Zi​,表示有一条长度为 Z

ICPC2018 徐州区域赛 比赛报告

ICPC2018 徐州区域赛 比赛报告 Sunder-杜逸闲 关于本比赛 本场比赛于2018.10.28在徐州由中国矿业大学承办,本人所在队伍Sunder – 由杜逸闲,裘家浩,周浩博组成的队伍 – 拿到了14/289金牌。 比赛过程 开场杜逸闲从后往前看,裘家浩从中间开始看,周浩博从前往后看题。 过了20分钟才有人过A题,杜逸闲开始读A题冗长的题面,发现A题是较简单题。 通过A之后有人

docker之SonarQube导出PDF报告

目录 一、拉取镜像二、下载插件三、安装插件四、配置PDF导出插件五、创建测试项目并运行六、导出PDF报告 一、拉取镜像 请使用 docker pull sonarqube:8.7.1-community 拉取镜像,高版本目前找不到支持 PDF导出的插件: docker pull sonarqube:8.7.1-community 二、下载插件 下载 sonar-pdf

2022年大作业参考报告-使用C++语言开发小学生成绩管理系统、中学生成绩管理系统、大学生成绩管理系统【240621更新】

背景: 目录 第一章 需求分析    2 1.1    问题描述    2 6.1    功能需求    2 6.2    开发环境    2 6.3    开发过程    2 第二章 概要设计    3 2.1    总体设计    3 2.2    类的定义    3 2.3    接口设计    5 2.4    运行界面设计    6 第三章 详细设计    7 3.1    输入模块