2.11 CW 模拟赛 T1. 刀等数学

news/2025/2/11 19:20:05/文章来源:https://www.cnblogs.com/YzaCsp/p/18710349

思路

题意

  • 给定一个长为 nn 的排列 aa 和一个最初为空的大根堆
  • 进行 2n2n 次操作
    • 取出堆顶放入 bb 末尾
    • 取出 aa 开头放入堆

求最终得到的 bb 的种类数

注意力惊人其实有点, 我说题解

性质

假设 11aa 中的位置为 pp , 在 bb 中的位置为 qq
因为 11 一定是堆中最后弹出来的数, 所以 a,ba, bqq 个数的集合应该相同, 不难发现 pqp \leq q

证明

因为 11 总是在堆中最后出现, 那么每次 11 出现在 bb 中, 堆一定是空的, 因此此时 a,ba, b 对应数集相同

进一步处理, 剩下的部分中, 其最小值也满足上面的性质
同样可以类似上面的做

所以现在我们知道一个合法解的性质了
如果你执行 : 找到序列的最小值 \(\to\) 切割 \(\to\) 找到序列的最小值 \(\to\) 切割 \(\to \cdots\) , 那么每次切下来的那一段中, 对应的 \(a, b\) 数集相同, 也就是说那一段中 \(a, b\) 对应的最小值相同
更一般的, 我们可以把每次切割产生的两个序列都如上处理, 仍然符合性质, 这提示我们使用区间 \(\rm{dp}\)

但是这样怎么统计数量?
考虑仿照分段的过程, 进行一个记忆化的搜索

我们每次处理当前 \([l, r], v\) , 表示考虑 \([L, R]\) 区间中 \(< v\) 的部分已经被填过了, 保证 \(a_L, a_R \geq v\) , 且存在 \(a_i \in [L, R] = v\) , 保证 \(a_{[L, R]}\)\(b_{[L, R]}\) 中数集相同

关于初始化 / 边界条件

  • lrl \geq r
    显然应当初始化为 11
  • a[L,R]<va_{[L, R]} < v
    这种情况下整个区间会被跳过, 应当初始化为 11

如果不存在 $a_{[L, R]} = v$

我们直接找到当前区间 [L,R][L, R] 中的最小值, 然后查询 fL,R,minf_{L, R, \min} 即可, 保证了区间中存在最小值

找到 \(a_{[L, R]}\) 的最小值位置 \(p\) , 枚举 \(b_{[L, R]}\) 中的最小值位置 \(q \in [p, R]\)

递归区间 \([L, p], (p, R]\) , 令 \(v \gets v + 1\) 表示已经处理完了 \(v\) 的位置, 以后 \(a\)\(< v\) 的就不管了, 已经填好了

为什么要递归这两个区间

只有这样才能保证区间中满足「保证 a[L,R]a_{[L, R]}b[L,R]b_{[L, R]} 中数集相同」

实现

#include <bits/stdc++.h>
#define int long longconst int MAXN = 105;
const int MOD = 8580287;
namespace calc {int add(int a, int b) { return a + b > MOD ? a + b - MOD : a + b; }int mul(int a, int b) { return (a * b * 1ll) % MOD; }int sub(int a, int b) { return a - b < 0 ? a - b + MOD : a - b; }void addon(int &a, int b) { a = add(a, b); }void mulon(int &a, int b) { a = mul(a, b); }
} using namespace calc;int n;
int a[MAXN];
int f[MAXN][MAXN][MAXN];int dfs(int l, int r, int x) {if (l >= r) return 1;if (f[l][r][x] != -1) return f[l][r][x];bool useless = true; for (int i = l; i <= r; i++) if (a[i] >= x) useless = false;if (useless) return f[l][r][x] = 1;int mn = n + 1; for (int i = l; i <= r; i++) if (a[i] >= x) mn = std::min(mn, a[i]);if (mn > x) return f[l][r][x] = dfs(l, r, mn);int ans = 0;bool flag = false;for (int i = l; i <= r; i++) {if (a[i] == x) flag = true;if (a[i] >= x && flag) addon(ans, mul(dfs(l, i, x + 1), dfs(i + 1, r, x + 1)));}return f[l][r][x] = ans;
}signed main()
{scanf("%lld", &n); memset(f, -1, sizeof(f));for (int i = 1; i <= n; i++) scanf("%d", &a[i]);printf("%lld", dfs(1, n, 1));return 0;
}

总结

找合法解的个数, 首先要尝试找到合法解的性质

一个新 trick\rm{trick}

排列类问题, 与大小有关系时, 尝试先找到 1,n1, n 这些特殊点的位置, 然后按照特殊点分段

区间 \(\rm{dp}\) 往往可以使用记忆化搜索简化难度
记忆化搜索应当处理好初始化 / 边界条件

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

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

相关文章

另辟新径实现 Blazor/MAUI 本机交互(三)

新建一个Maui blazor工程, 下面是工程关键文件解析. MainPage.xaml.cs 构造函数:通过 FindByName 方法查找名为 webView 的 WebView 控件,并将其赋值给 wvBrowser 变量。 创建 NativeBridge 的实例 api,并将 wvBrowser 传递给它。 使用 api.AddTarget 方法添加一个名为 dial…

nodejs如何处理Token?一文深入浅出JWT签名验签

关于token的那些事儿,一文深入浅出JWT签名验签前端开发中关于Token的那些事儿:深入浅出JWT签名验签 作为前端也要懂JWT,首先了解两个概念JWK JWT JWK JWK(RSA JSON Web Key)是一种用于表示 RSA 公钥或私钥的 JSON 对象,JWK 是 JSON Web Token (JWT) 和 JSON Web Encrypti…

前端开发中关于Token的那些事儿:深入浅出JWT签名验签

关于token的那些事儿,一文深入浅出JWT签名验签前端开发中关于Token的那些事儿:深入浅出JWT签名验签 作为前端也要懂JWT,首先了解两个概念JWK JWT JWK JWK(RSA JSON Web Key)是一种用于表示 RSA 公钥或私钥的 JSON 对象,JWK 是 JSON Web Token (JWT) 和 JSON Web Encrypti…

Eddystone 与 iBeacon

Eddystone 与 iBeacon 蓝牙信标 (Beacons) 是一种单向通讯方式,所以一般的用途就是发送提醒。 Beacons 是指使用蓝牙4.0(BLE)技术发射信号的小设备。 目前存活的 Beacons 标准有两个,分别是 Google 的 Eddystone 和 Apple 的 iBeacon. Eddystone Eddystone 是谷歌基于 Beac…

OrangePi 5 编译 Android12 源码

OrangePi 5 编译 Android12 源码 材料准备 源码下载地址 Orange Pi - Orangepi官方教程编译环境 在以下环境的 Ubuntu 虚拟机编译通过,基于 VMware Workstation 17 Pro.系统版本:ubuntu-18.04.6-lts-desktop-amd64; CPU:i5-8400,为 VM 分配 4 核; 内存:8G RAM + 16G swap…

Maui 基础 - Preferences 存储和检索应用程序的首选项

Maui 基础 Preferences 是 .NET MAUI 提供的一个静态类,用于存储和检索应用程序的首选项(即设置或配置)。它提供了一种简单的键值对存储机制,可以跨平台使用。每个平台使用其本地的存储机制来实现这些功能,例如:iOS 使用 NSUserDefaults Android 使用 SharedPreferences …

另辟新径实现 Blazor/MAUI 本机交互(一)

本系列由浅入深逐个文件解析工作原理 目录:WebViewNativeApi.cs NativeApi.cs MainPage.xaml.cs 实战 串口 小票机 蓝牙WebViewNativeApi.cs WebViewNativeApi.cs 文件中的代码实现了一个 NativeBridge 类,用于在 .NET MAUI 应用程序中的 WebView 和本地代码之间进行通信。以下…

AI 如何重塑劳动力市场:基于 Claude 数据的深度分析

前言 本文翻译自 Anthropic 今天发布的 The Anthropic Economic Index ,经济指数报告,这份报告基于 Claude 的数据对目前的 AI 使用情况做了汇总。 引言 在未来的几年里,人工智能系统将对人们的工作方式产生重大影响。因此,我们推出了 Anthropic Economic Index,这是一个旨…

Nacos Python SDK 强势来袭,动态管理大模型 Prompt!

Nacos 从 0.8.0 版本开始就一直参与 Python 生态建设,努力作为 Python 生态中分布式微服务发现和配置管理的解决方案一直往前演进。目前随着 AI 领域的发展,Nacos 社区的 Python 开发者用户越来越多,因此这次我们迭代了 Python 的 GA 稳定版本,对不少历史问题做了修复以及易…

踩坑记录-二分搜索的不同情况

二分搜索的不同情况 二分搜索可以用来查找满足条件的值,但是满足条件的值可能只有1个,也可能有多个。比如查找1的索引,对于【1,1,2,2】来说,就有2个。一般要求的就是:满足条件最大值/满足条件最小值。 二分搜索详细介绍可以参考:https://programmercarl.com/0704.二分…

《ESP32-S3使用指南—IDF版 V1.6》第五章 搭建开发环境

第五章 搭建开发环境 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/AT…

内测之家介绍

内测之家:助力应用开发与迭代的专业平台内测之家是一款功能强大且全面的应用内测与管理平台,专为 iOS 和 Android 开发者打造,旨在为他们提供便捷高效、安全可靠的一站式服务。无论是从资源安全到传输安全,还是从数据保护到应用管理、统计分析,内测之家都展现出卓越的能力…