AtCoder Regular Contest 184 D Erase Balls 2D

news/2024/9/23 16:56:24

转化计数对象。

直接数最终剩下的球的集合似乎并不好做。考虑数选择的球的集合(显然选择的顺序不重要,只有选择了哪些球重要)。

先把所有球按 \(x\) 坐标从小到大排序。设我们选择的球的下标为 \(i_1 < i_2 < \cdots < i_k\)。那么能选择这些球当且仅当 \(y_{i_1} > y_{i_2} > \cdots > y_{i_k}\)。因为若存在一对 \((p, q)\)\(p < q\))使得 \(y_{i_p} < y_{i_q}\),那么先选择任何一个都会导致另一个被删除。

但是很显然你直接这样数会算重,原因是一个最终剩下的球的集合可能对应多个选择的球的集合。考虑增加限制,数「选了集合外的任意一个球都会导致至少有一个球被删」的选择的球的集合。这样,选择的球的集合可以和最终剩下的球的集合一一映射。

判定一个选择的球的集合是否满足「选了集合外的任意一个球都会导致至少有一个球被删」,只需要判断对于所有相邻的球 \((i_p, i_{p + 1})\),把 \(i_p < j < i_{p + 1}\)\(a_{i_p} > a_j > a_{i_{p + 1}}\) 的球 \(j\) 拿出来,是否满足「\(j\) 前面有 \(y\) 比它小的球」或「\(j\) 后面有 \(y\) 比它大的球」。

考虑直接 DP(为了方便可以添加两个坐标分别为 \((0, n + 1), (n + 1, 0)\) 的球)。设 \(f_i\) 为考虑到前 \(i\) 个球且选了第 \(i\) 个球的方案数。转移枚举上一个在选择的球的集合内的球 \(j\)\(O(n)\) 判定 \(j\) 能否转移到 \(i\) 即可。

时间复杂度 \(O(n^3)\)

code
// Problem: D - Erase Balls 2D
// Contest: AtCoder - AtCoder Regular Contest 184
// URL: https://atcoder.jp/contests/arc184/tasks/arc184_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;const int maxn = 310;
const ll mod = 998244353;ll n, a[maxn], f[maxn], b[maxn], pre[maxn], suf[maxn];void solve() {scanf("%lld", &n);for (int _ = 0, x, y; _ < n; ++_) {scanf("%d%d", &x, &y);a[x] = y;}a[0] = n + 1;f[0] = 1;for (int i = 1; i <= n + 1; ++i) {for (int j = 0; j < i; ++j) {if (a[j] < a[i]) {continue;}int tot = 0;for (int k = j + 1; k < i; ++k) {if (a[j] > a[k] && a[k] > a[i]) {b[++tot] = a[k];}}pre[0] = 1e9;suf[tot + 1] = -1e9;for (int k = 1; k <= tot; ++k) {pre[k] = min(pre[k - 1], b[k]);}for (int k = tot; k; --k) {suf[k] = max(suf[k + 1], b[k]);}bool fl = 1;for (int k = 1; k <= tot && fl; ++k) {fl &= (pre[k - 1] < b[k] || b[k] < suf[k + 1]);}if (fl) {f[i] = (f[i] + f[j]) % mod;}}}printf("%lld\n", f[n + 1]);
}int main() {int T = 1;// scanf("%d", &T);while (T--) {solve();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

代理模式 - 动态代理

动态代理的APIProxy 动态代理类生成代理对象:Proxy.newProxyInstance( 类加载器,接口数组,处理器 )类加载器:对象.getClass( ).getClassLoader( ) 接口数组-被代理类的所有接口:被代理对象.getClass( ).getInterfaces( ) 处理器:代理对象调用方法时,会被处理器拦截Invoc…

9.23制作二维码

二维码在教育领域的应用日益广泛,如在线教育、校园导览等。学生可以通过扫描二维码,获取课程资料、校园地图等信息。这个海报上的二维码是连接到课文我变成了一棵树,直接看到文字内容,方便学生学习。

高级语言程序设计课程第一次个人作业 102400226 石华波

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第一次个人作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13264 学号:102400226 姓名:石华波

专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测!

专为工程地质领域安全监测而设计,BWII型广播预警遥测系统助您实现全面监测!BWII型广播预警遥测系统是一款新型的雨量预警监测仪,具备多通道和多类型传感器接入功能。该系统能够定时采集和发送电压、电流、数字和脉冲等信息,同时结合事件驱动的工作方式,以高频传感扫描和定…

2024 ByteCTF

ByteCTF 极限逃脱 题目描述:本题需要通过动态调试分析出要输入的内容,可能在某些地方会有提示出现。 这是一个IOS逆向,因为没有设备只能静态分析 流程和安卓逆向大概一致 解压拖进ida 提示输入flag格式 根据"-"进行切割其实就是uuid格式,正确输入后有一个赋值操…

网络流学习记录

CCPC网络赛 G Problem G. 疯狂星期六 Input file: standard input    Output file: standard output Time limit: 1 second      Memory limit: 256 megabytes yyq 和他的朋友们一共 n 个人(编号为 1 到 n ,yyq 编号为 1)去某饭店吃疯狂星期六。第 i 个人初始手中有 a…

PARTIII-Oracle事务管理-事务

10. 事务 10.1. 事务简介 事务是包含一个或多个SQL语句的逻辑、原子工作单元。事务将SQL语句分组,使它们要么全部提交,这意味着它们被应用到数据库中,要么全部回滚,这意味着它们从数据库中被撤销。Oracle数据库为每个事务分配一个唯一的标识符,称为事务ID。 所有Oracle事务…