[AGC061C] First Come First Serve 题解

news/2024/10/8 10:27:25/文章来源:https://www.cnblogs.com/Scarab/p/18451152

Description

\(n\) 个人来过,第 \(i\) 个人在 \(a_i\) 时刻来在 \(b_i\) 时刻走,每个人可以在来时或走时登记,问可能的登记顺序有多少种。

\(n\leq 5\times 10^5\)\(a_i,b_i\) 互不相同,\(\forall i<n,a_i<a_{i+1},b_{i}<b_{i+1}\)

Solution

首先如果每个人随便选,有 \(2^n\) 种方案。但这显然会算重。考虑构造一种方案使得选的方案和最终排列一一对应。

按照排列从小到大的顺序,如果当前 \((a_i,b_i)\) 中有数,则选 \(a_i\),否则选 \(b_i\),容易发现这样做一定能够一一对应。

这时一个选择不合法当且仅当对于某个 \(i\)\((a_i,b_i)\) 中没数但 \(i\) 选了 \(b_i\),可以对不合法的位置数进行容斥。

具体的,如果选了 \(a_i\)\(b_i\),则系数为 \(1\)\((a_i,b_i)\) 中没数且选 \(b_i\),则系数为 \(-1\)

容易发现对于任意两个钦定了不合法的位置 \(i,j\)\([a_i,b_i]\)\([a_j,b_j]\) 一定不相交。并且如果设 \(pre_i\) 表示最大的 \(b_j<a_i\)\(j\)\(nxt_i\) 表示最小的 \(a_j>b_i\)\(j\),那么如果 \(i\) 不合法,\((pre_i,i)\)\((i,nxt_i)\) 选择一定是固定的。这样就可以 dp 了。

\(f_i\) 表示前 \(i\) 个数的系数之和。那么 \(f_i=2f_{i-1}-\sum_{nxt_j+1=i}{f_{pre_j}}\)

时间复杂度:\(O(n)\)

Code

#include <bits/stdc++.h>// #define int int64_tconst int kMaxN = 5e5 + 5, kMod = 998244353;int n;
int a[kMaxN], b[kMaxN], pre[kMaxN], nxt[kMaxN], f[kMaxN];
std::vector<int> vec[kMaxN];constexpr int qpow(int bs, int64_t idx = kMod - 2) {int ret = 1;for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod)if (idx & 1)ret = (int64_t)ret * bs % kMod;return ret;
}inline int add(int x, int y) { return (x + y >= kMod ? x + y - kMod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + kMod); }
inline void inc(int &x, int y) { (x += y) >= kMod ? x -= kMod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += kMod : x; }void dickdreamer() {std::cin >> n;for (int i = 1; i <= n; ++i) std::cin >> a[i] >> b[i];for (int i = 1, j = 0; i <= n; ++i) {for (; b[j] < a[i]; ++j) {}pre[i] = j;}a[n + 1] = b[n + 1] = 2 * n + 1;for (int i = n, j = n + 1; i; --i) {for (; a[j] > b[i]; --j) {}nxt[i] = j;}for (int i = 1; i <= n; ++i) vec[nxt[i]].emplace_back(pre[i] - 1);f[0] = 1;for (int i = 1; i <= n; ++i) {f[i] = 2ll * f[i - 1] % kMod;for (auto j : vec[i]) dec(f[i], f[j]);}std::cout << f[n] << '\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/809834.html

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

相关文章

labview和QT编程

LabView LabView所面向的并非传统意义上的程序员。他的所有功能都可以通过组合某些组件来完成。程序的流程控制,比如循环之类的也是通过画图一样的操作来做的。 所有的程序功能几乎都可以通过鼠标来构造出来。优点是做一个能运行的程序非常简单。做一个虚拟的仪器很容易。也不…

kitti 数据集 可视化

1. 网址 KITTI官网网址:https://www.cvlibs.net/datasets/kitti/index.php 下载数据集:https://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d KITTI数据集论文:Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite github可视化代…

table 单元格合并

table 元素合并单元格,用法倒是很简单,但过程中遇到了点小问题,记录下: 1、多行多列合并,使用 rowSpan、colSpan 设置要合并的行列数,再将合并后的多余单元格删除即可:function merge(table, px, py, row, col, remove = true) {py--;let target = table.rows[px].cell…

php网站登录密码忘记了的三种解决办法

如果你忘记了PHP网站的登录密码,可以通过以下三种方法来解决这个问题: 1. 通过数据库直接修改密码 步骤如下:登录数据库:使用命令行工具(如 mysql 或 phpMyAdmin)登录到数据库。 例如,通过命令行登录 MySQL 数据库:mysql -u root -p选择对应的数据库:选择包含用户表的…

还不知道这个原则的程序员,要小心了

“无规矩不成方圆”,来了禅道以后才发现,其实小公司也应该有自己的代码规范。大家好,我是陈哥,今天聊聊规范优先原则 ~背景 前几天,和我同事闲谈,聊到我在来禅道之前参与过的一个项目。当时,小团队对代码规范不够重视,结果合并代码时出现大量格式冲突,解决问题费时费力…

phpinfo函数的作用

phpinfo() 函数是 PHP 中的一个内置函数,主要用于显示关于 PHP 配置的各种信息。这些信息包括 PHP 版本、已加载的扩展、环境变量、HTTP 头信息、目录路径设置等。这对于调试和了解当前 PHP 运行环境非常有用。作用包括:显示 PHP 的版本号。 列出所有已启用的扩展及其版本信息…

宝塔面板打不开怎么办

如果遇到宝塔面板无法打开的问题,可以尝试以下几个步骤来排查和解决问题:检查网络连接确保服务器与客户端之间的网络连接正常,尝试访问其他网站或服务以确认网络状况。查看端口是否开放宝塔面板默认使用的端口号为8888(或自定义端口),确保该端口在服务器防火墙中已经开放…

[Markdown] Markdown 及文档格式转换

1 概述 : Markdown Markdown 的诞生什么是 Markdown? Markdown 的诞生初衷Markdown 是一种用于编写结构化文档的纯文本格式,基于在电子邮件和 usenet 帖子中指示格式的约定。 它由 John Gruber 开发(在 Aaron Swartz 的帮助下),并于 2004 年以 语法描述 和用于将 Markdown…

如果 表名 拼写错误或表不存在,你会看到 #1146 - Table ecms.表名 doesnt exist 的错误

<?php $servername = "localhost"; $username = "your_username"; $password = "your_password"; $dbname = "ecms";// 创建连接 $conn = new mysqli($servername, $username, $password, $dbname);// 检查连接 if ($conn->con…

错误消息:#2002 - Cant connect to local MySQL server through socket /tmp/mysql.sock (2)

错误消息:#2002 - Cant connect to local MySQL server through socket /tmp/mysql.sock (2) 原因:数据库服务未启动。 连接参数错误。解决方法:检查数据库服务:确认 MySQL 服务是否正常运行。sudo service mysql status检查连接参数:确认连接参数(主机名、用户名、密码、…

请问想登录宝塔面板但是忘记密码_宝塔密码忘记了怎么办

通过邮箱找回:如果你在设置宝塔面板时绑定了邮箱,可以通过绑定的邮箱来找回密码。 访问宝塔面板登录页面,找到“忘记密码”选项并点击,按照提示输入已绑定的邮箱地址。 登录邮箱查看收到的重置链接或验证码,按照邮件中的指引完成密码重置。通过SSH命令行重置:首先通过SSH…