P9330 [JOISC 2023] JOI 国的节日 2 题解

news/2025/2/11 20:36:25/文章来源:https://www.cnblogs.com/Scarab/p/18710433

Description

对于以下问题:

给定长度为 \(n\) 的序列 \(a\)\(b\),满足以下条件:

  • 在序列 \(a\) 与序列 \(b\) 中,\(1\)\(2n\) 的整数各出现恰好一次;
  • 对于 \(1\leq i\leq n\)\(a_i<b_i\)
  • 对于 \(1\leq i<n\)\(a_i<a_{i+1}\)

求:最多能在 \([a_i,b_i]\) 中选出多少个两两不交的区间。

考虑以下算法:

\(1\)\(n\) 枚举 \(i\),若 \([a_i,b_i]\) 与所有已经选择的区间都不交,则选择该区间。最后输出选择的区间数。

给定 \(n\),求:有多少个满足条件的序列对 \((a,b)\),使得以上算法无法求出正确的结果。答案对 \(p\) 取模。

\(1\leq n\leq 2\times 10^4\)\(P\) 是质数。

Solution

首先正确的策略一定是按照右端点从小到大贪心。考虑用总方案数减去最终结果正确的方案数。

不妨将第二种策略选的线段看成红色,第一种看成蓝色,两种同时选的看成紫色,都没选的看成黑色,那么将线段按照右端点排序后一定是红蓝交替或者紫色排列在一起。如图:

然后考虑红线段的性质:

  1. 红线段不交。
  2. 前一个红线段的右端点到下一个红线段的左端点之间不存在完整的线段。

蓝线段:

  1. 蓝线段不交。
  2. 前一个蓝线段的右端点到下一个蓝线段的左端点之间不存在某个线段的左端点。

那么就可以 dp 了。

然后考虑从前往后每次插入一对红蓝或者紫线段,设 \(f_{i,j,0/1}\) 表示已经插入了 \(i\) 个线段,有 \(j\) 个左端点尚未匹配,且最后是红蓝/紫线段的方案数。

转移时枚举插入的黑色线段数量即可。时间复杂度:\(O(n^3)\),过不了。


注意到上面那个做法枚举黑色线段数量这部分是无法省略的,所以考虑优化状态数量。

由于这题对左端点的限制强于右端点,所以考虑倒着插入线段,同时为左端点找其匹配的右端点。这样会发现只要确定了左端点的位置之后,右端点就随便选了。

具体地,设 \(f_{i,0/1}\) 表示目前倒着插入了 \(i\) 个线段,最后插入的是红蓝/紫线段,且目前已经为大于最前面的红/紫线段的右端点 的左端点找到匹配的右端点的方案数。

然后考虑转移。这里只讨论 \(0\to 0\) 的转移。有两种情况,需要分类讨论:

上图是第一种情况。先枚举加入的黑色线段的左端点个数 \(j\),容易发现这 \(j\) 个左端点只能放在上图中的前三个区间里,由于此时并没有给上一步最后添加到两个线段分配左端点,所以可以先固定 \(j\) 个加入的左端点,然后用上一步最后线段的左端点将其分成三部分,方案数为 \(\frac{(j+1)(j+2)}{2}\)

然后是为这 \(j\) 个左端点找到匹配的右端点。注意到右端点可以插在最后一个区间内的任何位置,而这个区间有 \(2i-2\) 个段,方案数即为 \((2i-2)^{\overline{j}}\)。于是这种情况的贡献为 \(f_{i,0}\times\frac{(j+1)(j+2)}{2}\times(2i-2)^{\overline{j}}\)

这是第二种情况,和第一种情况贡献是一样的。所以转移式为 \(f_{i+j+2,0}\leftarrow f_{i,0}\times(j+1)(j+2)\times(2i-2)^{\overline{j}}\)

其余三种转移是类似的。

求答案时还需要枚举最后加了多少个黑色线段,贡献也是类似的。

时间复杂度:\(O(n^2)\),卡常后可过。

Code

#include <bits/stdc++.h>// #define int int64_tusing i64 = int64_t;const int kMaxN = 2e4 + 5;int n, mod;
int fac[kMaxN * 2], ifac[kMaxN * 2], f[kMaxN][2];struct Barrett {int64_t m, p;void init(int64_t mod) {m = ((__int128_t)1 << 64) / mod;p = mod;}Barrett(int64_t mod = 2) { init(mod); }inline int64_t operator()(int64_t x) {x -= (((__int128_t)x * m) >> 64) * p;return x >= p ? x - p : x;}
} Reduce;constexpr int qpow(int bs, int64_t idx = mod - 2) {int ret = 1;for (; idx; idx >>= 1, bs = (int64_t)bs * bs % mod)if (idx & 1)ret = (int64_t)ret * bs % mod;return ret;
}inline int add(int x, int y) { return (x + y >= mod ? x + y - mod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + mod); }
inline int mul(int x, int y) { return Reduce(1ll * x * y); }
inline void inc(int &x, int y) { (x += y) >= mod ? x -= mod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += mod : x; }
inline void multi(int &x, int y) { x = Reduce(1ll * x * y); }inline int getfac(int l, int r) {return l <= 0 ? 0 : 1ll * fac[r] * ifac[l - 1] % mod;
}inline int up(int x, int k) {return getfac(x, x + k - 1);
}void prework(int n = 4e4) {fac[0] = 1;for (int i = 1; i <= n; ++i) fac[i] = 1ll * i * fac[i - 1] % mod;ifac[n] = qpow(fac[n]);for (int i = n; i; --i) ifac[i - 1] = 1ll * i * ifac[i] % mod;
}void dickdreamer() {std::cin >> n >> mod;Reduce.init(mod);prework(2 * n);f[1][1] = f[2][0] = 1;for (int i = 1; i < n; ++i) {for (int o1 = 0; o1 <= 1; ++o1) {if (!f[i][o1]) continue;for (int o2 = 0; o2 <= 1; ++o2) {int tmp = 1ll * f[i][o1] * ifac[2 * i - 2 + o1 - 1] % mod;for (int j = 0; j <= n - i - 2 + o2; ++j) {int coef = tmp;multi(coef, fac[2 * i - 2 + o1 + j - 1]);if (!o1) multi(coef, j + 1);if (!o2) multi(coef, j + !o1 + !o2);inc(f[i + j + 2 - o2][o2], coef);}}}}int ans = 1;for (int i = 1; i <= 2 * n; i += 2) ans = 1ll * i * ans % mod;for (int i = 1; i <= n; ++i) {int j = n - i;dec(ans, 1ll * (j + 1) * up(2 * i - 2, j) % mod * f[i][0] % mod);dec(ans, 1ll * up(2 * i - 1, j) * f[i][1] % mod);}std::cout << ans << '\n';
}int32_t main() {
#ifdef ORZXKRfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifstd::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int T = 1;// std::cin >> T;while (T--) dickdreamer();// std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";return 0;
}

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

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

相关文章

一站式合同自动化:飞书审批与腾讯电子签的完美融合

Z国际教育中心专注于将全球顶尖教育资源引入中国,通过本地化整合与优化,将这些优质资源转化为中国青年触手可及的学习机会。我们的使命是帮助学生培养深厚的家国情怀与开阔的国际视野,助力他们成长为未来社会的栋梁之才。 遇到的问题 1. 业务种类多,合同审批繁琐 通过飞书平…

Linux下Docker及Nvidia Container ToolKit安装教程

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 我们接下来在Ubuntu中安装Docker(安装详见:Get Docker | Docker Docs)及NVIDIA Container Toolkit(安装详见:Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.17.3 documentat…

在用 uni-app 开发钉钉小程序的时候遇到一个奇怪的问题,发送请求拿不到返回的数据

今天我一位同事说用 uni-app 新开发的钉钉小程序里发送请求拿不到返回的数据,看了下发现调试工具的“Network”栏里显示请求是发送成功的,也有返回数据,但是没触发请求的回调函数。 原本用的是 luch-request 这个库发送的请求,后来试了下 uni-app 内置的 uni.request 以及钉…

15. 进程处理

一、什么是进程进程(Process)是正在运行的程序,是操作系统进行资源分配的基本单位。程序是存储在硬盘或内存的一段二进制序列,是静态的,而进程是动态的。每个进程都由自己的地址空间、代码段、数据段以及分配给它的其它系统资源(如文件描述符、网络连接等)。 二、创建子…

我把deepseek等大模型接入了微信公众号,打造个人AI助手

我把deepseek等大模型接入了微信公众号,打造个人AI助手前言 最近deepseek大模型可是火出了圈,给国产大模型公司点赞。于是乎去deepseek试了一下效果,奈何太多人使用了,问两句来一句 “服务器繁忙,请稍后再试”,体验感实在太差了。 作为程序员,怎么能忍受?于是乎去寻找d…

(未解决)word中插入pdf图片(高清、矢量图)

(未解决)word中插入pdf图片(高清、矢量图) 1.个人诉求: pdf高清矢量格式的图片,插入至word中 2.尝试的解决方法: https://blog.csdn.net/weixin_45399376/article/details/115281547?spm=1001.2014.3001.5502。 3.具体操作步骤: 1)word——插入——对象——文件中的文…

一语总结

一语总结 真心建议把找到的一些性质和做法以文字形式写下来,当掉不过样例的时候一个一个检查其正确性。”P9169 [省选联考 2023] 过河卒“用DFS将环当作平局是错误的因为这可能只是一个不优的必胜/必败局面,正确的做法是老实建图按拓扑序跑BFS。就这个结论的错误害我虚空调题…

软考高级《系统架构设计师》知识点(二)

操作系统知识 操作系统概述操作系统定义:能有效地组织和管理系统中的各种软/硬件资源,合理地组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。 操作系统有三个重要的作用:管理计算机中运行的程序和分配各种软硬件资源; 为用户提供…

Linux驱动---LED

本文介绍了 Linux 内核中的 pinctrl 子系统和 GPIO 子系统,并通过编写 RGB 三色灯驱动程序,展示了如何在实际应用中使用这两个子系统来控制硬件设备目录一、pinctrl子系统二、GPIO子系统三、GPIO操作步骤3.1、获取GPIO描述符3.2、设置方向3.3、读写值四、编写LED驱动4.1、硬件…

PVE 服务器通过脚本进行优化

此处使用的优化脚本为pve_source.tar.gz,需要的可以自己从网上下载‌pve_source‌是一款用于Proxmox VE(PVE)的辅助脚本,主要用于一键换源、更新系统、升级系统、开启直通等功能,能够方便地进行PVE虚拟机的配置和管理,提高工作效率。‌ 一、上传并运行优化脚本 1、首先我…

018 Module的语法

历史上,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成相互依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至就连CSS都有@import,但是JavaScript任何方面的支持都没有,这对开发大型的、复杂的项目形成…