题面传送门

A:我该是有多无聊来写这种题的题解啊

B:大概是因为这题题解区里没有题解所以我来写一篇了,说明我有高尚的济世情怀(大雾

跑题了跑题了

首先看到字典序第 \(i\) 小小可以自然地想到按位决策,也就是说从高位到低位枚举,对于每一位我们强制令它为 I,看看有多少个符合要求的字符串,如果小于 \(i\) 就将这位改为 \(1\) 并继续往下枚举。

那么怎么求有多少个符合要求的字符串呢?这时候就要用到 DP 了。显然一个字符串可以成为某个字符串的正规读法当且仅当它的字典序 \(\le\) 反串的字典序,因此我们很容易设计出一个 \(dp\) 状态:\(dp_{i,j,o,x,y}\) 表示当前决策了字符串的前 \(i\) 位和后 \(i\) 位,有 \(j\) 对 XI 相邻,\(o\) 表示反串字典序是否等于原串字典序,从前往后数第 \(i\) 位为 \(x\),从后往前数第 \(i\) 位为 \(y\) 的方案数。转移就枚举第 \(i+1\) 位填的数 \(u\) 和第 \(n-i\) 位填的数 \(v\),如果 \(o=1\) 且 \(u>v\) 就会导致原串字典序 \(>\) 反串字典序,不合法。否则显然有如下转移方程式子:

  • \(dp_{i+1,j+[u\ne x]+[v\ne y],o\land[u==v],u,v}\leftarrow dp_{i,j,o,x,y}\)

注意特判 \(i+1=n-i\) 的情况和 \(i+2=n-i\) 的情况,对于前者而言必须有 \(u=v\),因为它俩是同一位,对于后者而言转移的第二维还需额外加上 \([u\ne v]\)。

时间复杂度 \(32n^3\),跑得飞快(

const int MAXN=60;
const char str[3]="IX";
int n,k;ll m,dp[MAXN+5][MAXN+5][2][2][2];
int lim[MAXN+5];
ll calc(){
memset(dp,0,sizeof(dp));
for(int a=0;a<2;a++) for(int b=a;b<2;b++){
if(~lim[1]&&(lim[1]^a)) continue;
if(~lim[n]&&(lim[n]^b)) continue;
dp[1][0][a==b][a][b]=1;
} ll ans=0;
for(int i=1;(i<<1|1)<=n;i++) for(int j=0;j<=k;j++)
for(int o=0;o<2;o++) for(int x=0;x<2;x++) for(int y=0;y<2;y++){
if(!dp[i][j][o][x][y]) continue;
if((i<<1|1)==n){
for(int u=0;u<2;u++){
if(~lim[i+1]&&(lim[i+1]^u)) continue;
if(j+(u^x)+(u^y)<=k) ans+=dp[i][j][o][x][y];
}
} else{
for(int u=0;u<2;u++) for(int v=0;v<2;v++){
if(~lim[i+1]&&(lim[i+1]^u)) continue;
if(~lim[n-i]&&(lim[n-i]^v)) continue;
if(o&&u>v) continue;
if((i+1<<1)==n){
if(j+(u^x)+(u^v)+(v^y)<=k) ans+=dp[i][j][o][x][y];
} else dp[i+1][j+(u^x)+(v^y)][o&&u==v][u][v]+=dp[i][j][o][x][y];
}
}
}
return ans;
}
int main(){
scanf("%d%d%lld",&n,&k,&m);
if(n==1) return ((m>2)?puts("NO SUCH STONE"):(putchar(str[m-1]))),0;
if(n==2){
if(k==0) return ((m>2)?puts("NO SUCH STONE"):(putchar(str[m-1]),putchar(str[m-1]))),0;
else return ((m>3)?puts("NO SUCH STONE"):((m&1)?(putchar(str[m>>1]),putchar(str[m>>1])):puts("IX"))),0;
} memset(lim,-1,sizeof(lim));
if(m>calc()) return puts("NO SUCH STONE")&0;
for(int i=1;i<=n;i++){
lim[i]=0;ll sum=calc();
if(m>sum) m-=sum,lim[i]=1;
}
for(int i=1;i<=n;i++) putchar(str[lim[i]]);
return 0;
}

洛谷 P4663 - [BalticOI 2008]魔法石(dp)的更多相关文章

  1. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  2. 洛谷 P4665 [BalticOI 2015]Network

    洛谷 P4665 [BalticOI 2015]Network 你有一棵 $ n $ 个节点的树,你可以在树上加一些边,使这棵树变成一张无重边.自环的图,且删掉任意一条边它仍然联通.求最少要加多少条边 ...

  3. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  4. 洛谷 P4072 [SDOI2016]征途 斜率优化DP

    洛谷 P4072 [SDOI2016]征途 斜率优化DP 题目描述 \(Pine\) 开始了从 \(S\) 地到 \(T\) 地的征途. 从\(S\)地到\(T\)地的路可以划分成 \(n\) 段,相 ...

  5. 洛谷P1880 石子合并(区间DP)(环形DP)

    To 洛谷.1880 石子合并 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1 ...

  6. 洛谷P1063 能量项链(区间DP)(环形DP)

    To 洛谷.1063 能量项链 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的 ...

  7. 洛谷P1282 多米诺骨牌 (DP)

    洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...

  8. 洛谷 P5469 - [NOI2019] 机器人(区间 dp+拉格朗日插值)

    洛谷题面传送门 神仙题,放在 D1T2 可能略难了一点( 首先显然对于 P 型机器人而言,将它放在 \(i\) 之后它会走到左边第一个严格 \(>a_i\) 的位置,对于 Q 型机器人而言,将它 ...

  9. 【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)

    次元传送门:洛谷P4158 思路 f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数 显然的是 每次换行都要增加一次次数 那么当j ...

随机推荐

  1. python中的信号通信 blinker

    信号: 信号是一种通知或者说通信的方式,信号分为发送方和接收方.发送方发送一中信号,接收方收到信号的进程会跳入信号处理函数,执行完后再跳回原来的位置继续执行.常见的linux中的信号,通过键盘输入Ct ...

  2. Django Model字段加密的优雅实现

    早前的一篇文章Django开发密码管理表实例有写我们写了个密码管理工具来实现对密码的管理,当时加密解密的功能在view层实现,一直运行稳定所以也没有过多关注实现是否优雅的问题.最近要多加几个密码表再次 ...

  3. 提升使用Linux效率的小操作

    提升使用Linux效率的小操作 保存更新? 本文记录了个人在使用Linux时觉得好用的一些快捷方式/功能: 为那种知道了能提高效率,但是的不知道也并没有影响的操作. 历史命令 该操作用于快速查看已使用 ...

  4. 谈谈BEM规范(含代码)

    css规范之BEM规范 前言 引用一句经典名言在编程的世界里其中一件最难的事情就是命名,不管是设计到编程语言还是标记语言都会有命名的需求.今天聊的就是关于css的命名规范的发展过程以及演变. 命名的发 ...

  5. 大闸蟹的 O O 战记

    一. 第四单元架构设计分析 第一次作业,UML类图 第一次作业的主要任务是完成对UML类图的解析并实现查询等操作,需要在课程组给定的框架中添加函数.对于UML类图,其存储是按照元素来存储的,其将所有的 ...

  6. golang常用库:cli命令行/应用程序生成工具-cobra使用

    golang常用库:cli命令行/应用程序生成工具-cobra使用 一.Cobra 介绍 我前面有一篇文章介绍了配置文件解析库 Viper 的使用,这篇介绍 Cobra 的使用,你猜的没错,这 2 个 ...

  7. Delphi的手机程序隐藏顶部信号栏

    把TForm的BorderStyle设置为None 记之!

  8. ffmpeg第7篇:数据流选择神器-map指令

    自动选择规则 ffmpeg在处理视频时,如果只提供了输入和输出参数,ffmpeg会自动地去选择相应的视频流和音频流来合成文件 自动选择的方式根据如下规则: 视频流:选分辨率最高的,比如有两个视频,一个 ...

  9. 创建双向 CA x509 验证证书 kube-apiserver

    1. 设置 kube-apiserver 的 CA 证书相关的文件和启动参数 使用 OpenSSL 工具在 Master 服务器上创建 CA 证书和私钥相关的文件: # openssl genrsa ...

  10. 安装、卸载 node.js出错 Could not access network location *:\node.js\ 出错

    上周五,WIN10自动更新系统,导致我的node.js 和 Gradle 还有解压的winRAR都不能用!!!可恶 自动更新!!可恶啊!!! 然后我想把node.js重新卸载了再安装,结果 很慌很慌, ...