首页 > 其他分享 >AtCoder Beginner Contest 313 Ex Group Photo

AtCoder Beginner Contest 313 Ex Group Photo

时间:2023-09-21 18:12:32浏览次数:44  
标签:AtCoder typedef Group Beginner ll long maxn define

洛谷传送门

AtCoder 传送门

考虑若重排好了 \(a\),如何判断可不可行。显然只用把 \(b\) 排序,把 \(\min(a_{i - 1}, a_i)\) 也排序(定义 \(a_0 = a_{n + 1} = +\infty\)),按顺序逐个判断是否大于即可。

这启示我们将 \(\min(a_{i - 1}, a_i)\) 排序考虑。考虑从大到小加入 \(a_i\),那么加入一个 \(a_i\),和它相邻的 \(\min(a_{i - 1}, a_i)\) 一定是 \(a_i\)。每个时刻已经加入的 \(a_i\) 形成了若干个连续段,考虑连续段 dp:

设 \(f_{i, j}\) 为考虑了 \(a\) 中前 \(i\) 大的数,当前形成了 \(j\) 个连续段。那么有 \(i - j\) 对相邻的数。

初值为 \(f_{2, 2} = 1\),表示一开始加入了 \(a_0\) 和 \(a_{n + 1}\)。

有转移:

  • \(a_i\) 新开一个段,这个段可以在两段之间的空隙中:\(f_{i, j + 1} \gets f_{i - 1, j} \times (j - 1)\);
  • 把 \(a_i\) 接入一个段的开头或末尾,需要满足 \(a_i < b_{i - j}\),此时有:\(f_{i, j} \gets f_{i - 1, j} \times (2j - 2)\);
  • 把 \(a_i\) 塞进两个相邻段的空隙中,然后合并这两个段,需要满足 \(a_i < b_{i - j + 1}\),此时有:\(f_{i, j - 1} \gets f_{i - 1, j} \times (j - 1)\)。

答案为 \(f_{n + 2, 0}\)。

时间复杂度 \(O(n^2)\)。

code
// Problem: Ex - Group Photo
// Contest: AtCoder - AtCoder Beginner Contest 313
// URL: https://atcoder.jp/contests/abc313/tasks/abc313_h
// 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 = 5050;
const ll mod = 998244353;

ll n, a[maxn], b[maxn], f[maxn][maxn];

inline void upd(ll &x, ll y) {
	((x += y) >= mod) && (x -= mod);
}

void solve() {
	scanf("%lld", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	for (int i = 1; i <= n + 1; ++i) {
		scanf("%lld", &b[i]);
	}
	sort(a + 1, a + n + 1, greater<ll>());
	sort(b + 1, b + n + 2, greater<ll>());
	f[2][2] = 1;
	for (int i = 3; i <= n + 2; ++i) {
		for (int j = 1; j < i; ++j) {
			if (!f[i - 1][j]) {
				continue;
			}
			upd(f[i][j + 1], f[i - 1][j] * (j - 1) % mod);
			if (a[i - 2] < b[i - j]) {
				upd(f[i][j], f[i - 1][j] * (j * 2 - 2) % mod);
			}
			if (i - j <= n && a[i - 2] < b[i - j + 1]) {
				upd(f[i][j - 1], f[i - 1][j] * (j - 1) % mod);
			}
		}
	}
	printf("%lld\n", f[n + 2][1]);
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:AtCoder,typedef,Group,Beginner,ll,long,maxn,define
From: https://www.cnblogs.com/zltzlt-blog/p/17720608.html

相关文章

  • 更新wsl,docker无法启动wrong fs type, bad option, bad superblock on cgroup, missi
    PSC:\Users\xxxx>wsl-vWSL版本:2.0.0.0内核版本:5.15.123.1-1WSLg版本:1.0.57MSRDC版本:1.2.4485Direct3D版本:1.608.2-61064218DXCore版本:10.0.25880.1000-230602-1350.mainWindows版本:10.0.22000.2295sudoservicedockerstartmount:/sys/fs/cgroup/cpuset:wron......
  • Linq Group by
    点击查看代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;publicclassProgram{publicstaticvoidMain(){varlist=newList<Emp>{newEmp{Age=1,Comp="11",Name="111"},newEmp{A......
  • 关于hive中使用group by报错的问题的解决
    问题描述+问题解决在我在hive数据库中使用groupby的函数时,如果在我们决定显示出来的字段名中有非聚合的字段(即字段名为原生字段名,并没有加什么SUM等聚合函数),那么,我们就必须在groupby后面引用上这个非聚合字段,否则就会报错;同时,在我们写数据到新的数据表中时,一定要保证我们所......
  • AtCoder Grand Contest 017
    链接C.SnukeandSpells容易发现合法序列排序后一定是若干段值域连续的部分组成:可以发现最小次数就是重叠/空出的部分大小。每次修改只会对\(O(1)\)个点\(±1\),直接维护即可。#include<iostream>#include<cstdio>#include<cstring>#include<vector>#defineN200010......
  • group by 用java代码实现
    importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;publicclassListGroup{publicstaticvoidmain(String[]args){List<JavaBean>list=newArrayList<JavaB......
  • AtCoder Grand Contest 023 E Inversions
    洛谷传送门AtCoder传送门首先将\(a\)从小到大排序,设\(p_i\)为排序后的\(a_i\)位于原序列第\(p_i\)个位置,\(x_i\)为要填的排列的第\(i\)个数。设\(A=\prod\limits_{i=1}^n(a_i-i+1)\),则\(A\)为排列的总方案数(考虑按\(a_i\)从小到大填即得)。套路地,统......
  • Jasper模板使用记录七——Group分组
    Group特点1.通过Group分组可以将集合中的数据进行分组显示2.Group分组有GroupHeader和GroupFooter可以在每个组的前后添加元素3.Group分组的效果是在Detail中显示的注意点Group并不会将乱序的集合数据进行分组和排序,只会按照集合的顺序进行遍历,如果本条数据和上一条......
  • 【Pandas】groupby连用的count()和size()的区别
    groupby连用的count()和size()的区别count()计算的是value(数值);size()计算的是size(个数)我们有以下表:size()age=df.groupby(by='Nation').size().reset_index()age可以发现,size()计数的是记录的条数,即每个nation对应有多少条count()count=df_try.groupby(by=......
  • Atcoder Regular Contest 165(A~E)
    赛时45min切A~C,降智不会D,罚坐1h,喜提rk70+->rk170+。A-SumequalsLCM可证明结论:若\(N\)只含有一种质因子则无解,否则有解。B-SlidingWindowSort2这么多cornercase的题竟然10min一发入魂,类目了。由于操作是升序排序,且要求最终字典序最大,所以如果存在一个......
  • Qt中QGroupBox控件上禁用标志怎么去掉
    ref: https://blog.csdn.net/u011281951/article/details/131316569问题描述:如下图,使用qt新建一个工程,发现QGroupBox控件上总是有个禁用标志,有时候又没有,不清楚怎么回事,网上查了一圈没发现合适的答案,摸索一圈好像找到窍门了,记录下来,气候作为参考(网上的小伙伴如清楚这块的配置,欢......