补题报告之S班暑训第三场

2021hych / 2023-08-01 / 原文

成绩

比赛经过

\(\text{A}\) 看上去像一个贪心。由于不知道咋搞,胡出一个假的结论。\(x\) 选手在别的榜单所在位置,之后的选手优先选,多个榜单,按照满足条件的榜单数量对每个选手排序。然后模拟。事实证明,他只有 \(\text{50}\) 分。

\(\text{B}\) 没理解样例咋来的,也不知道斜对角线的明确定义。感觉题目不是很清晰。打表 \(0\) 分。

\(\text{C}\) 题,想了想 \(type=0\) 的规律,样例给了一个神奇的规律 \(x\)\(a_{x+1}\) 交换?然后喜提 \(0\) 分。

\(\text{D}\) 题,无脑暴力 \(10\) 分。(本身就是冲着 \(10\) 分写的,没想 \(30\) 分的暴力。)

赛后补题+分析

\(\text{A}\) beauty

简要/形式化题意

\(n\) 个长度为 \(k\) 的队列(队列内的元素组成一个 \(1\)\(k\) 的排列),按顺序循环遍历 \(n\) 个队列,每遍历到一个队列,取出队首元素,把 \(n\) 个队列所有的这个元素删除。一开始任意改变第 \(v\) 个队列,使得最后的 \(x\) 被最晚删除。求最晚删除时间。

题解

结论:遍历时跳过第 \(v\) 个队列,模拟得到的结果即为答案。

模糊的证明:总会存在一组方案,使得 \(v\) 能恰好在该算法求得的删除时间之前把所有应该已经被删掉的和不会使答案变差的元素删掉。

暴力模拟,时间复杂度 \(O(nk)\)

AC code

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,k,v,x;
int a[N][N],vis[N];
int cal() {
	for(int i=1;i<=k;i++) vis[i]=0;
	for(int i=k;i>=1;i--) {
		int h=(k-i)%n+1;
		int cnt=0; 
		if(h==v) continue;
		for(int j=1;j<=k;j++) {
			if(vis[a[h][j]]) continue;
			vis[a[h][j]]=1;
			if(a[h][j]==x) return i; 
			break;
		}
	}
	return 1;
}
int main() {
	while(scanf("%d%d%d%d",&n,&k,&v,&x)!=EOF) {
		for(int i=1;i<=n;i++)
			for(int j=1;j<=k;j++) scanf("%d",&a[i][j]);
		printf("%d\n",cal());
	}
	return 0;
}

\(\text{B}\) coloring

简要/形式化题意

现在有个 \(n \times m\) 的棋盘,每次你可以将一行或者一个斜对角线(从左下到右上)的格子给染黑,请问共有多少种可能的最终状态。

题解

对于一个局面贪心地先使用行操作染色,考虑 \(n\) 个行操作以及 \(n+m-1\) 个对角线操作哪些合法。第一,对于第 \(i\) 个对角线操作,如果第 \(i-m+1\)\(i\) 个操作都被使用过了,那么不使用这个对角线操作。第二,对于第 \(i\) 个行操作,如果第 \(i\)\(i+m-1\) 个对角线操作都被使用了,那么我们必须使用这个操作。容易发现在满足这样的约束条件后,统计是互斥且互补的。

于是,可以 \(dp\) 求解(但不太明白咋搞,先咕着)

AC code

咕咕咕

\(\text{C}\) swap

简要/形式化题意

给出一个长度为 \(n\) 的数列 \(a\),以及一个整数 \(x\),定义一次操作为:

选择一个下标 \(i\) \((1\le i\le n)\),交换 \(a_i\)\(x\) 的值。

求最少的操作次数使得数列 \(a\) 单调不降。

题解

先咕着,因为没看懂~

AC code

咕咕咕

\(\text{D}\) string

简要/形式化题意

给定一个字符串 \(s\)。若随机选择两个相同的子串。求两个子串的重合的长度的期望。

题解

先咕着,因为没看懂~

AC code

咕咕咕

考后反思

这部分分给的好少。后三题显然是超出我能力范围,第一题又是个结论题,主要是举例子找规律吧,比硬着头皮推一个模糊的证明踏实一些。

结尾

题解咋看不懂嘞?