AT_arc068_d [ARC068F] Solitaire 分析

news/2025/10/30 21:39:16/文章来源:https://www.cnblogs.com/high-sky/p/19178195

题目概述

Snuke 决定玩 \(N\) 张卡片和一个双端队列(即 deque)。每张卡片上显示一个从 \(1\)\(N\) 的整数,而 deque 最初是空的。

Snuke 将按照从 \(1\)\(N\) 的顺序,一次将卡片插入 deque 的开头或末尾。然后,他将执行以下操作 \(N\) 次:从 deque 的开头或末尾取出卡片并吃掉它。

之后,我们将通过按吃掉的卡片的顺序排列整数,构造一个整数序列。在通过这种方式可以获得的序列中,找出第 \(K\) 个元素为 \(1\) 的序列的数量。将答案对 \(10^9+7\) 取模后输出。

数据范围:\(1\leq k\leq n\leq2000\)

分析

思维好题。

注意到题目的加数方式可以得到类似于一个 “V” 字形的图像(其中 \(x\) 为最终序列的第 \(i\) 个数,\(y\) 为第 \(i\) 项的数值大小)。

我们现在考虑取数的情况。

应该满足以下的情况:

  • \(k\) 个取的一定是 \(1\)
  • \(k\) 个数一定由两个或者一个序列组成,其中一个序列包含 \(1\)
  • 还没有取的数的最大值一定小于这两个序列当中的其中一个的最小值。

由于是两个下降的序列,所以取数的时候肯定也是有两个或一个下降的序列,设我们取了的数量为 \(k\)(取完了 \(1\)),那么剩下 \(n-k\) 个,于是随便取就是 \(2^{n-k-1}\),最后一个数只有一种方案。

我们设这两个序列为 \(A,B\),且钦定 \(A\) 最后要包含 \(1\)

于是设 \(f_{i,j}\) 表示取了 \(i\) 个数,\(A\) 中的最小值为 \(j\) 的方案。

那么再设 \(B\) 中的最小值为 \(mn\),以及剩下的数的最大值为 \(mxs\)

我们考虑怎么转移。

我现在新加入一个数 \(x\),那么分为两种情况:

  • \(x<j\),那么可以放到 \(A\) 中,于是有 \(f_{i,j}\rightarrow f_{i,x}\)
  • \(x>j\),那么不能放到 \(A\) 中,一定要放到 \(B\) 中,而我们需要满足 \(mxs<mn\),也就是说我们这里的 \(x\) 只有为 \(mxs\) 时放入到 \(B\) 中,这样之后的 \(B\) 依然满足条件,所以 \(f_{i,j}\rightarrow f_{i+1,j}\)

最后的答案就是 \(2^{n-k-1}\times \sum_{i=2}^{n-k+2}f_{k-1,i}\)

代码

时间复杂度 \(\mathcal{O}(n^2)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define int long long
#define N 2005
using namespace std;
const int mod = 1e9 + 7;
int qpow(int a,int b) {int res = 1;while(b) {if (b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}
int n,k,f[N][N];
signed main(){cin >> n >> k;for (int i = 2;i <= n;i ++) f[1][i] = 1;for (int i = 1;i < k - 1;i ++) {f[i + 1][n - i + 1] = f[i][n - i + 1];for (int j = n - i;j >= 2;j --)f[i + 1][j] = (f[i + 1][j + 1] + f[i][j]) % mod;}int ans = 0;for (int i = 2;i <= n - k + 2;i ++) ans = (ans + f[k - 1][i]) % mod;if (k == 1) ans = 1;if (n - k - 1 >= 0) ans = ans * qpow(2,n - k - 1) % mod;cout << ans;return 0;
}
//csp rp++

后记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/951146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[CSP-S 2024] 擂台游戏 题解

CSP-S2024 T4后天就 CSP2025 了我终于想起来订正 [CSP-S 2024] 擂台游戏 了。 谨以此篇,安慰去年考场上拼尽全力大战 \(2.5h\) 只获得 \(40pts\) 的自己。 思路来自于这篇题解。约定 为了方便描述,我们做如下约定:对…

10/30观后感

大二的课程安排中,《数据结构》《统一建模语言》《工程实训》等课程占据了重要位置。在学习过程中,我们接触到了 “链表”“多态”“软件生命周期” 这类关键概念。这些知识固然有着重要的理论意义,但总给人一种抽象…

20251030周四日记

20251030周四日记今日: 1.早上遛狗吃完午饭才回学校,谁叫下雨了呢。 2.下午跟好兄弟杜聊了会,很有缘昨晚还梦到,取了他的文件。继续看看炜那篇毕设,请教张老师得到回答,画个框图试试。 3.晚上小组会没啥用。张老…

手写汉字识别

import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision.transforms as transforms from torch.utils.data import DataLoader, Dataset, random_split from torch.optim.…

Keil仿真条件断点10.30

Keil5软件仿真中可以使用“CTRL+B”打开断点设置界面。条件断点需要仿真器支持,已知ST-LINK可以,以下变量均为全局变量 条件断点1:设置执行多少次后停下。操作如下图所示定义好后如下图访问断点2:读/写变量时停下 …

CSP-S 复赛游记

\(\mathcal Day\ -1\) 2025/10/30 在机房打算写一个分块的模板代码笔记,但是写到一半发现自己爆炸了,好饿。 所以毅然决然地选择偷看HHY在干嘛,发现他在写复赛Day -2游记,所以我说我也要写,然后后面FBT就说今天其…

P6149 [USACO20FEB] Triangles S 总结

P6149 [USACO20FEB] Triangles S 总结P6149 [USACO20FEB] Triangles S 总结 思路历程 这一题还是相当有趣的,首先我们不难发现,题目要求的就是一个两个直角边平行于 \(x\) 和 \(y\) 的直角三角形。 此时我们想到,这…

10.30 程序员的修炼之道:从小工到专家第三章 基本工具 - GENGAR

第三章 “基本工具” 强调程序员需跳出单一 IDE,掌握多元基础工具。第 14 节指出纯文本由可打印字符构成,虽曾因算力存储受限不占优,但如今具备不过时(自描述性可明确信息含义,如标注 SSNO 的社会保障号)、有杠杆…

数据预处理

inputs.fillna(inputs.mean()) mean() 方法只能用于数值型数据,而如果你的 DataFrame 中包含字符串列,就会出现类型不兼容的错误。 解决方法是只对数值型列进行均值填充,忽略字符串列。可以这样修改: 这个错误的原…

学校机房电脑进阶操作

为了能做学校机房内获得更好的体验,本文章可以帮助你更好地改善你在机房使用的电脑。本文章适用于对电脑能熟练使用的人,对电脑基础操作不熟悉的不建议使用。 本内容将持续更新,若有建议,欢迎提出!(由于本文章刚…

AH2022 钥匙

钥匙 洛谷 P8339 钦定当有很多把钥匙能打开开宝箱时使用最后拿到的一把(应该要想想用第一把打开,实际不好做。) 每种颜色 \(col\) 的钥匙和宝箱是互相独立的,可以对每种颜色建出虚树。对于一把钥匙 \(u\),以它为根…

在国内体验 Claude Code 编程助手的可行方案 —— 我的 Evol AI 工作空间实践分享

前言 一直以来,我都在寻找一个能真正提升开发效率的 AI 编程助手。 我曾用过 GitHub Copilot,补全效果不错,但在处理复杂需求、跨文件逻辑时能力不足。后来了解到 Anthropic 的 Claude Code——支持超长上下文(200…

应用安全 --- vmp 之 代码虚拟化

应用安全 --- vmp 之 代码虚拟化所谓代码虚拟化就是用汇编指令模拟cpu的运行方式实现了一套软件虚拟机处理引擎和需要执行的虚拟化字节码 有点类似java和net的实现原理。 他们不同点就是代码虚拟化vmp是为了保护代码的…

Flask 入门:轻量级 Python Web 框架的快速上手 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java第二天

十类型转换 自动类型转换:小范围可以自动转换为大类型表达式的类型转换:不同的类型相加结果要用最大的那个类型来接收。、强制类型转换:大范围不能直接赋值给小范围。但是通过强制转换是可以的,但是会失真,例如一…

八、认识for循环

1.for循环的概念 循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。如果条件满足,则重复执行相应的语句,当条件不满足,退出循环。 2.for循环的基本格式 for( 循环变量的初值; 循环条件; 循环变量的增…

CCUT应用OJ——小龙的字符串函数

题目简介题源:1073 - 小龙的字符串函数 | CCUT OJ 题意:给定 \(n\) 个等长字符串,定义函数 \(f(s_i,s_j)\) 表示字符串 \(s_i\) 与 \(s_j\) 中位置和字符相同的总数。输出 \(\sum f(s_i,s_j)\) ( 其中 \(i<j\) )…

OceanBase系列---【oceanbase的oracle模式新增分区表】

OceanBase系列---【oceanbase的oracle模式新增分区表】TIPS分区选择建议 按天分区: 适用于数据量极大(每天千万级以上)、需要频繁删除历史数据的场景 按月分区: 适用于数据量中等(每月百万到千万级)、最常用的分区方式…

cursor 数据路径 防止试用账号误删数据

C:\Users\xxx\.cursor C:\Users\xxx\AppData\Local\Programs\cursor C:\Users\xxx\AppData\Roaming\Cursor C:\Users\xxx\AppData\Roaming\Cursor\User 备份这个路径就行

Bettercap(中间人攻击神器)

Bettercap(中间人攻击神器)https://github.com/bettercap/bettercap/releaseshttps://github.com/bettercap/bettercap/releases/download/v2.41.4/bettercap_windows_amd64.zip 安装完运行会提示缺少 libusb.dll ht…