首页 > 其他分享 >CF2000 A~C 题解

CF2000 A~C 题解

时间:2024-08-21 22:37:58浏览次数:8  
标签:dots 题解 pos CF2000 ans operatorname 回车

Codeforces Round 967 (Div. 2) A~C 题解(未完待续)

唐完了,B 构造不会,C 交互不会,整场爆切 \(1\) 题喜提 \(-115\) rating 强势上灰!我还会什么?

I. 2001A - Make All Equal

先找出答案的下界。设众数为 \(x\),其出现的次数为 \(\operatorname{cnt}(x)\)。由于每次操作只能删除一个数,答案不可能小于 \(n - \operatorname{cnt}(x)\)。

下面证明这个下界是可以达到的。用 \(y\) 代表所有的非众数,那么在非众数被删光之前,序列可以表示成 \(x \dots x, y \dots y, \dots\) 之类 \(x\) 与 \(y\) 的连续段交替出现的形式。只需证明一定存在一对相邻元素(这里的相邻指环上的相邻)满足前者小于后者即可。

反证法,如果不存在,则 \(x > y > \cdots\)。由于序列是一个环,所以可以导出 \(x > x\),这是不可能的,故得证。

代码

II. 2001B - Generate Permutation

我是傻逼,我没做出来这题

先考察满足要求的序列有什么性质。可以发现(事实上,我并没有发现),对于从左往右的打字员来说,假设他已经打出了 \(x\),要打 \(x + 1\),只有 \(\operatorname{pos}_x > \operatorname{pos}_{x+1}\) 时他才要按一次回车(其中 \(\operatorname{pos}_x\) 表示 \(x\) 的下标)。因此他按回车的次数 \(c_1 = \sum_{i=1}^{n-1} [\operatorname{pos}_x > \operatorname{pos}_{x+1}]\)。

(这里应该模拟一下打字的过程才能更顺理成章地发现这个结论:假设我已经打出了 \(x\),要打 \(x + 1\),我能直接移动然后打出来,还是必须得回车?显然,只有 \(x + 1\) 在 \(x\) 前面时才要回车,这就对应了 \(\operatorname{pos}_x > \operatorname{pos}_{x+1}\)。这样想的话,这个结论并不难得出,但是我为什么没想到呢?)

同样的,对于从右往左的打字员,只有 \(\operatorname{pos}_x < \operatorname{pos}_{x+1}\) 时他才要按一下回车,因此他按回车的次数 \(c_2 = \sum_{i=1}^{n-1} [\operatorname{pos}_x < \operatorname{pos}_{x+1}]\)。

合法的序列应该满足 \(c_1 = c_2\)。显然,对于 \(x\) 和 \(x + 1\),要么 \(\operatorname{pos}_x > \operatorname{pos}_{x+1}\) 成立,要么 \(\operatorname{pos}_x < \operatorname{pos}_{x+1}\) 成立,所以 \(c_1 + c_2 = n - 1\),因此 \(c_1 = c_2 = \dfrac{n-1}{2}\)。这就说明 \(n\) 是偶数时一定没有合法方案。

\(n\) 是奇数时,可以手模出许多合法的方案。以 \(n = 7\) 为例,一种好想的思路是:先用一堆降序的数把 \(c_1\) 给占满,比如 \(7, 6, 5, 4\)。那么剩下的数必须是升序的,否则会让 \(c_1\) 变大。直接填进去即可: \(1, 2, 3, 7, 6, 5, 4\) 就是可行的。(你会发现 \(7, 6, 5, 4, 1, 2, 3\) 是不可行的,因为 \((3, 4)\) 这一对让 \(c_1\) 变大了)。

因此,\(n\) 是奇数时, \({\color{blue}1, 2, \dots, \left\lfloor \dfrac{n-1}{2} \right\rfloor,} {\color{red}n, n-1, \dots, \left\lfloor \dfrac{n+1}{2} \right\rfloor}\) 是一个合法的方案。这里用不同颜色区分构造时分别填入的两段。

void solve()
{
	int n;
	cin >> n;
	if((n & 1) == 0)
	{
		cout << -1 << endl;
		return;
	}
	
	vector<int> ans(n);
	iota(ans.begin(), ans.end(), 1);
	reverse(ans.begin() + (n/2), ans.end());
	for(int x: ans) cout << x << ' ';
	cout << endl;
}

代码

III. 2001C - Guess The Tree

下面是官方题解的思路。我自己想不出来这个做法,所以不知道用什么语言来引入。

把点划分为两个点集 \(A\) 和 \(B\),\(A\) 中的点是知道其内部边集的点,\(B\) 中的点是不知道的。

初始时,任意把一个点加入 \(A\) 中(例如 \(1\)),\(B\) 是剩下的 \(n-1\) 个点。

我们的策略是:每次把一个新的点加入到 \(A\) 中。这个点必须和原来 \(A\) 中的某个点有连边,否则根本无法把它加入 \(A\)。

任选点 \(u \in A\),\(v \in B\),查询 \(u, v\) 的中点 \(x\)。如果 \(x \in A\),则令 \(u \gets x\),否则令 \(v \gets x\)。这里的要义是,时刻保证 \(u \in A\) 且 \(v \in B\)。最终当 \(x = u\) 时,就表明 \(u\),\(v\) 之间有边相连,可以更新答案的边集。由于我们保证了 \(v \in B\),所以可以把 \(v\) 加入到 \(A\) 中,并在 \(B\) 中删掉 \(v\)。

这里的查找类似二分,每次找到一个新点的查询次数不会超过 \(\log n\),总次数不超过 \(n \log n\),可以通过此题。

但是我不知道我自己该如何想出这些东西

标签:dots,题解,pos,CF2000,ans,operatorname,回车
From: https://www.cnblogs.com/dengstar/p/18372706

相关文章

  • CF889E题解
    \(\text{Problem-889E-Codeforces}\)\(\text{*3000}\)题意给一个序列,对于一个非负整数\(x\),有一个式子:\[x\bmoda_1+x\bmoda_1\bmoda_2+...+x\bmoda_1\bmoda_2...\bmoda_n\]求出上式的最大值。思路先去寻找题目的性质。首先\(x\)的值单调不增,然后如果当前\(x......
  • [SCOI2014] 方伯伯的玉米田 题解
    对于每次修改的区间以及其左边序列和右边序列,共三种情况:1.区间内比两侧低的还是低2.区间内比两侧低的变得比两侧高了3.区间内比两侧高的还是高那么现在又面临一个问题:在区间内变化后,对答案,即最长不下降子序列有什么影响。对区间左边:可能会使其最长不下降子序列增长对区间......
  • SP368 CSTREET - Cobbled streets 题解
    题意选n−1条道路连接n个城市,且使得其修建的价格最小。分析最小生成树的模板题,可以用kruskal来做。首先,先将所有的边权从小到大排序。然后,取当前没有选过的,且边权最小的边,判断它连接的两个点是否同属一个集合,如果不是就把他们加到同一个集合中,再记录答案。代码很简单,......
  • [CERC2019] ABB 题解
    题目可以转化为求最长回文子串,答案就是长度减去最长回文子串的长度。看到是求最长回文子串,一眼就容易想到马拉车。此题只需在求出回文半径的基础上储存回文串的右端点,将求出的右端点排序,只要右端点不在最后的字符就结束(不能补),如果在最后的字符就取原字符串长度与当前回文子串的差......
  • [JOISC 2023 Day3] Tourism 题解
    大家好,我喜欢珂朵莉树,所以我用珂朵莉树\(AC\)了本题。实际上,我们比较容易发现,这题实际上就是求\([l,r]\)中的所有点作为关键点时,虚树所压缩的所有点(实际上就是显现出来的点+在虚边上的点)。那么我们容易发现,一个点\(x\)作为虚树所压缩的所有点的充要条件为:\(x\)是至少......
  • 【题解】Solution Set - NOIP2024集训Day12 树上启发式合并
    【题解】SolutionSet-NOIP2024集训Day12树上启发式合并https://www.becoder.com.cn/contest/5472「CF600E」Lomsatgelral直接dsuontree。记录每一个颜色的出现次数。「IOI2011」Race之前是用点分治做的。考虑dsuontree。每个子树内维护到根节点的距离为\(x\)......
  • SP368 CSTREET - Cobbled streets 题解
    题意选n−1条道路连接n个城市,且使得其修建的价格最小。分析最小生成树的模板题,可以用kruskal来做。首先,先将所有的边权从小到大排序。然后,取当前没有选过的,且边权最小的边,判断它连接的两个点是否同属一个集合,如果不是就把他们加到同一个集合中,再记录答案。代码很简单,......
  • 莫队的 1.5 近似构造 题解
    前言题目链接:洛谷。感觉T4比T3水,虽然我都没做出来。题意简述给定\(1\simn\)的排列\(a\)和\(m\)个区间\([l_i,r_i]\)。定义值域区间\([L,R]\)的价值为\(\operatorname{val}([L,R])\operatorname{:=}\max\limits_{i=1}^m\sum\limits_{k=l_i}^{r_i}[L......
  • P10892 SDOI2024 题解
    【题意简述】你有一个数字\(n\),每次操作将\(n/2\),如果\(n\)是一个奇数,你会纠结是向上取整还是向下取整。问你最少纠结多少次。多组数据。【思路】为了方便起见,我们在二进制下重新审视这个题目:在二进制下,一个数除以\(2\)等同于右移一位。默认向下取整,因为右移会舍弃......
  • P7706 文文的摄影布置 题解
    P7706文文的摄影布置题解原题读完题,发现是线段树。单点修改+区间查询。不过查询的值有些奇怪,就是了,我们考虑用线段树维护这个ψ值(下称待求值)。对于一个区间的待求值,大概有四种情况:如上图四种情况分别为:待求值最大值在左区间待求值最大值在右区间\(a_i与b_j\)在左......