首页 > 其他分享 >AtCoder Regular Contest 184 D Erase Balls 2D

AtCoder Regular Contest 184 D Erase Balls 2D

时间:2024-09-23 16:50:53浏览次数:1  
标签:AtCoder typedef Balls Contest long 选择 maxn 集合 define

转化计数对象。

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

先把所有球按 \(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;
}

标签:AtCoder,typedef,Balls,Contest,long,选择,maxn,集合,define
From: https://www.cnblogs.com/zltzlt-blog/p/18427333

相关文章

  • AtCoder Beginner Contest 372 补题记录
    A-delete题意:输出删除字符串中.后的字符串思路:只输出字符串中不是.的字符voidsolve(){strings=sread();for(autoit:s)if(it!='.')cout<<it;cout<<endl;}B-3^A题意:给出M,求将M拆分成N个3的\(A_i\)次方相加思路:贪心,从大到小用......
  • AtCoder Beginner Contest 372(A - F)
    A:直接输出。B:把\(M\)三进制拆分,最多10位,每位最多为2,\(N\le20\)足够了。C:暴力修改,每次只产生\(O(1)\)影响。D:预处理st表,二分每个\(j\)会断哪些\(i\)产生贡献,差分一下。E:启发式合并平衡树,\(k\)更大也能做。F:只保留有特殊边经过的点,把\(i,j\)之间的\(j-i......
  • The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem H. Points Selectio
    注意到如果$\text{query}(a,b,c)$为真,那么$\text{query}(\geqa,\geqb,c)$一定为真。从小到大枚举询问中$a$的值,按横坐标从小到大依次加入每个点,维护$f_c$表示最小的$b$满足$\text{query}(a,b,c)$为真。假设当前正在加入点$(x,y,w)$,有$f_{(c+w)\bmodn}=\min(f_{......
  • The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem B. Mountain Bookin
    从$1$到$m$依次考虑每个日期。假设当前正在考虑第$i$天,那么只有第$i$天来访的游客以及指定第$i$天的查询是有用的。将这些游客和查询都提取出来,通过Kruskal重构树可以很方便地在$O(n\logn)$的时间内计算出这些查询的答案。不幸的是,本题还有加边删边操作,无法轻易地......
  • Atcoder Beginner Contest 372
    AtcoderBeginnerContest372A模拟即可。#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){charch;while(cin>>ch){if(ch!='.'){cout<<ch;}}}......
  • AtCoder Beginner Contest 372
    省流版A.暴力即可B.转换3进制即可C.考虑答案的组成,仅修改发生变化的部分即可D.维护答案数组\(ans_i\),考虑枚举\(j\)对哪些\(i\)有贡献,通过单调栈找到对应的区间\(i\),通过差分维护区间加法即可E.并查集维护连通块,\(set\)维护点标号大小,合并\(set\)时启发式合并,查询......
  • The 2024 ICPC Asia EC Regionals Online Contest (II)
    目录写在前面F签到A枚举J贪心I构造,二进制L数学,三分G数学,辗转相除E结论,最短路写在最后写在前面补题地址:https://codeforces.com/gym/105358。以下按个人向难度排序。妈的7题秒完剩下的题感觉没一个能做的。F签到#include<bits/stdc++.h>#definelllonglongcon......
  • UNIQUE VISION Programming Contest 2024 Autumn (AtCoder Beginner Contest 372)
    总结(我的塘人局):单调栈是忘得差不多了 A-delete.题意:输出删除所有'.'的字符串思路:遍历输出不是'.'复杂度:O(n) Code:#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;usingi64=int64_t;voidsolve(){strings;cin......
  • The 2024 ICPC Asia East Continent Online Contest (I)——F. Make Max
    https://qoj.ac/contest/1794/problem/9313#include<bits/stdc++.h>#definexfirst#defineysecondusingnamespacestd;typedeflonglongll;typedefpair<ll,ll>pii;constintN=2e5+10,mod=1e9+7;lln,m,q;inta[N],stk[N],tt;intl[N],r[N];......
  • [atcoder agc 004 c] AND Grid
    题目链接题目简述给定一个H×WH\timesWH×W的网格图,有些位置已经被涂色。要求构造两个相同大小的网格图......