专栏文章

题解:CF2161D Locked Out

CF2161D题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min9rhhb
此快照首次捕获于
2025/12/01 22:53
3 个月前
此快照最后确认于
2025/12/01 22:53
3 个月前
查看原文
简单(迫真)做法
把不符合要求的两个位置连一条边,原题变为最小点覆盖。
发现图是二分图,转最大匹配(资料)。
接下来观察图的形态,把值相同的分一层,第 ii 层里的点都有 au=ia_u=i
ii 层的点 uu 会向 i+1i+1 层里所有 v>uv>u 的点 vv 连边。
这启发我们贪心,层数从小到大,每层从大到小,贪心匹配下一层最大的。
时间复杂度 O(n)O(n)
CPP
const int N = 3e5 + 5;
int n, a[N];
vector<int> e[N];
void solve() {
	read(n);
	FOR(i, 1, n) read(a[i]);
	FOR(i, 1, n) e[i].clear();
	FOR(i, 1, n) e[a[i]].pb(i);
	int ans = 0;
	FOR(i, 1, n - 1) {
		ROF(j, SZ(e[i]) - 1, 0) {
			if(e[i + 1].empty()) break;
			if(e[i][j] < e[i + 1].back()) {
				e[i + 1].pop_back();
				ans ++;
			}
		}
	}
	print(ans);
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...