当前位置: 首页 > news >正文

AT_arc068_d [ARC068F] Solitaire 分析

题目概述

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.jsqmd.com/news/26880/

相关文章:

  • 10/30观后感
  • 20251030周四日记
  • 手写汉字识别
  • Keil仿真条件断点10.30
  • 10.30 程序员的修炼之道:从小工到专家第三章 基本工具 - GENGAR
  • 在国内体验 Claude Code 编程助手的可行方案 —— 我的 Evol AI 工作空间实践分享
  • 八、认识for循环
  • OceanBase系列---【oceanbase的oracle模式新增分区表】
  • cursor 数据路径 防止试用账号误删数据
  • why is making friends, love bad
  • DP题解
  • 逆序对略解
  • 解码Shell 脚本编程
  • 第10天(中等题 滑动窗口)
  • 树形dp部分题目总结
  • 人工智能之编程基础 Python 入门:第三章 基础语法
  • 模块-文本
  • 偏微分方程数值解
  • oier的呻吟
  • 进销存软件和ERP是包含关系吗?
  • jenkins 权限控制(用户只能看指定的项目)
  • CF1784C Monsters (hard version)
  • [Programming Tips]Teach Yourself Programming in Ten Years by Peter Norvig
  • 世界上最牛逼的人—黄景行
  • X991CN-个人自制计算器
  • 非计算机专业,保姆级申请软著教程
  • F5重大安全事件:国家级黑客窃取BIG-IP源代码与技术漏洞
  • 2025年功效型洗发水品牌推荐榜:二硫化硒去屑洗发水/香氛洗发水/控油蓬松洗发水/MASIL玛丝兰以科技适配多元洗护需求​
  • 10.30(续)
  • Python字典 _ 创个秒查流行语的词典