转存的 中考前训练

等掉。

思维杂题

AGC020C

好题一道。

把所有数记为全集 \(U\)。不妨先考虑上空集。那么假设我们当前选择的集合为 \(S\),那么对于 \(S\) 关于 \(U\) 的补集 \(T\),我们有 \(\sum S + \sum T = \sum U\),这是显然的。

\(k = \frac{\sum U}{2}\)。容易发现对于任意 \(\sum S < k\) 的集合 \(S\),都可以找到一个满足 \(\sum T > k\) 的集合 \(T\)。反之同理。

\(f_i\) 表示 \(i\) 能否被表示出来。可以发现除了 \(f_0\) 之外,\(f_i\) 关于 \(k\) 对称。

于是只需求出 \(f_i\) 后,从 \(k\) 往右找到第一个能表示出来的数即可。求出 \(f_i\) 的过程 bitset 优化一下就好。

U454744

萌熊搬的题。lcw 老师讲的挺好。

我们把数看作球与盒子。具体地对于样例,看作盒子 \(1\) 上有两个球,盒子 \(2\) 上有两个,盒子 \(3\) 上有 \(1\) 个。

显然每个盒子只能留 \(1\) 个球。考虑移球。显然我们会移动代价较小的球。用堆维护这个即可。

放下代码,写的挺优美。

for (ll i = 1; i <= n; i ++ )
{
	ll sz = 1;
	while (Arr[i].first == Arr[i + 1].first) ++ i, ++ sz;
	if (sz == 1 && !q.size()) continue;
	for (ll j = i; j >= i - sz + 1; j -- ) q.push(Arr[j].second), Tot += Arr[j].second;
	Tot -= q.top(); q.pop();
	ll Pos = Arr[i].first + 1;
	while (q.size() && (i == n || Pos < Arr[i + 1].first))
	{
		ll t = q.top(); q.pop();
		Ans += Tot, Tot -= t;
		++ Pos;
	}
	Ans += Tot;
}

P6155

加强。

考虑上述算法的执行过程。我们仍然需要移球。我们给每个球维护一个入队、出队时间。这样每个球的操作次数就知道了。贪心地给操作次数较大的球配较小的 \(b\)。现在我们需要选择哪些球去移,哪些球留下。

考虑现在到了第 \(x\) 个盒子。现在有若干个球。我们需要选择哪个留下。假设从前面移过来的球为 \(S\)(可能不止一个),本来就在盒子 \(x\) 的球为 \(T\)(可能不止一个)。

显然,无论如何 \(S\) 的操作次数总 \(> T\)\(S\) 总是会分配到更大的 \(b\)。于是操作 \(S\) 比操作 \(T\) 更优。这个可以感性理解一下。于是我们弹出 \(T\),用 \(T\)\(x\)。也就是,对于每个盒子,用前面离它最近的球去填。这个用栈维护即可。

手写栈,即线性。

P2127

妙。

手玩几个小样例。考虑图论建模,每个数所在的位置向它需要在的位置建边。

你会发现一定形成了若干个环。对于每个环分别考虑。每个环内我们肯定会拿最小值换一圈。记和为 \(S\),最小值是 \(M\),环的大小为 \(n\)。代价就是 \((n-2)M + S\)。然后注意我们还可以拿全局最小值 \(M'\) 来换,代价就是 \((n + 1)M' + S + M\)。每个环取最小值即可。容易证明每个环都是独立的,对别的无影响,那么就是对的。

P15245

场外选手被创飞了。这个 96pts 真的只有蓝么 \ll

容易想到在二进制下考虑问题。\(\times 2\) 就是左移一位,\(+1\) 就是低位 \(+1\)。有一个重要的观察:

  • 我们不会对较大数 \(y\)\(\times 2\) 操作。这是因为对于状态 \((x,y)\) 和状态 \((2x,2y)\) 总是等价的,且后者的代价必定比前者劣。

然后对 \(y\)\(+1\) 操作与对 \(x\)\(-1\) 操作也等价。于是可以把 \(y\) 定下来,对 \(x\)\(\times 2\)\(+/- 1\) 操作来达到 \(y\)

比较小的暴力就可以写了。然后没有思路了,我们来思考性质 B 咋做。手模一下过程,你会发现我们会将 \(x\) 左移 \(k\) 位,这样 \(x,y\) 的高位是相同的。然后在过程中做 \(+1\) 来使得低 \(k\) 位与 \(y\)\(k\) 位相同。这样答案就是 \(k + popc(y \bmod 2^k)\)。但是你发现我们可以给 \(y\) 加若干次 \(1\) 来使 \(y\) 的低 \(k\) 位的 \(1\) 最小,也就是 \(popc(y \bmod 2^k)\) 最小。我们枚举加了 \(z\)\(1\),答案就是 \(k + z + popc((y + z) \bmod 2^k)\)。取 \(\min\) 即可。

考虑更一般的情况。仍然记 \(k\) 表示 \(x\) 需要左移的次数。分讨一下:

  • \(x \times 2^k \ge y\)。我们希望 \(k\) 尽量小。此时只能通过 \(-1\) 来达成目的。答案是固定的 \(k + x \times 2^k - y\)
  • \(x \times 2^k < y\)。我们希望 \(k\) 尽量大。但这个时候 \(y\) 的高位不一定与 \(x\) 相同了。你发现这几位你只能在一开始对 \(x\) 操作来相等。记 \(g = y - x \times 2^k\)。答案就是 \(k + \lfloor \frac{g}{2^k} \rfloor + popc(g \bmod 2^k)\)。但是同理的,可能通过对 \(g\)\(+1\) 来使 \(popc(g \bmod 2^k)\) 更小。综上,答案就是 \(k + z + \lfloor \frac{g}{2^k} \rfloor + popc((g + z) \bmod 2^k)\)

考虑一下 \(z\) 的范围。由于 \(popc \le log V\), 有 \(z \le \mathcal{O(log V)}\)。如果将 popcount 函数的复杂度考虑为 \(\mathcal{O(log V)}\),总的时间复杂度就是 \(\mathcal{O(Tlog^2 V)}\)。可以获得 96pts。

CF1537D

我喜欢你。

打表可以得到答案。这里补个证明。分讨 \(n\) 的状态:

  • \(n\) 为奇数。若 \(n\) 为质数,先手必败,否则操作后 \(n\) 一定变成偶数。
  • \(n\) 为偶数且 \(n \ne 2^p\),下一步 \(n\) 必定变成奇数。

因此第一种情况先手必败,第二种情况先手必胜。

\(n\) 为偶数且 \(n = 2^p\),由于只要不选 \(\frac{n}{2}\),下一步还给对手的就是第二种情况,此时对手必胜,这是没道理的。于是此时最优的策略就是一直选 \(\frac{n}{2}\),这样还有可能胜利。

那么做完了。

P15359

真的只有绿吗?跳了。

看到二元组计数的问题无非两种方向,一种是固定某个端点,一种是双指针。

我们先考虑前者。我们枚举右端点 \(R\),然后容易发现 \(L\) 有单调性,对于满足条件的 \((L,R)\),有 \((L-1,R),(L-2,R) \cdots (1,R)\) 都是满足条件的。考虑二分这个 \(L\),判断 \((L,R)\) 是否合法只需要随便写个搜索就好了。时间复杂度 \(\mathcal{O(n^2\log n)}\),结合两个不知所云的特殊性质可以获得 60pts。

你发现瓶颈在于搜索。由于只有两行思考刻画一下满足要求的充要条件。我们把能通过的格子记为 \(1\),否则为 \(0\)。手模一下可以得到:

  • 起点终点均为 \(1\)
  • 对于 \(\forall i\)\(A_{0,i} = A_{0,i-1}\)\(A_{1,i} = A_{1,i-1}\)

于是直接对这些东西计数即可。可是仍然是 \(\mathcal{O(n)}\) 的,有点倒闭。

容易想到双指针。你会发现在 \(L,R\) 移动的过程中,上面这些东西的贡献是可以 \(\mathcal{O(1)}\) 计算的。那么做完了。

ARC158C

什么叫一年前学的题现在不会了?

考虑把 \(f(x,y)\) 拆成 \(x + y - 9g(x, y)\),其中 \(g(x,y)\) 表示 \(x,y\) 进位的次数。

只需计算 \(g\) 的值。

考虑按位计算。假设当前枚举到第 \(k\) 位,那么要在第 \(k\) 位发生进位需要满足 \(A + B \ge 10^{k+1}\)。枚举 A 容易二分出 B 的范围。计数一下就好。

P6005

不会。

考虑直接 dp。\(f_{i,j}\) 表示第 \(i\) 天在 \(j\) 点。考虑一下时间的范围。记时间最大值为 \(T\),有 \(CT^2 \ge Tm_i\),将 \(C = 1\)\(m_i = 1000\) 代入解出 \(T \le 1000\)。那么 \(\mathcal{O(nT)}\) 直接过了。

分层图好像也能做。

P8186

自己过了?

考虑对于每个奶牛单独做。每次枚举奶牛 \(i\) 能不能配对 \(j\),你会发现这是个二分图完美匹配问题。每次删边即可。时间复杂度 \(\mathcal{O(n^3)}\)

实际上有些麻烦。考察二分图的过程,实际上对于某个左部点 \(i\),我们总是按连边的顺序一个个寻找配对的右部点 \(j\),这实际上是个贪心的过程。我们按照喜欢的优先级从大到小连边即可。每只奶牛跑一遍匹配就好了。时间复杂度 \(\mathcal{O(n^2)}\)

另一个做法。注意到我们总是在不停更换两个奶牛的礼物。那么假设当前 \(1\)\(2\) 交换,\(2\)\(3\) 交换 ... 最后又换到 \(1\) 手上,那是不是就合法了呢?我们将每只奶牛向它希望的礼物对应的奶牛连边,那么只要出现环,这个方案就合法了。使用 floyd 传递闭包即可。是三次方的。

P8266

由于强制操作区间长度为偶数,这样我们在对 \([l,r]\) 做翻转操作时,可以发现 \(\forall i \in [l,r]\) 的元素 \(i\) 所在位置的奇偶性都发生了改变。这是很美好的。并且,如果我们要翻转 \([l,r]\),先翻转 \([1,l)\) 再翻转 \([1,r]\) 这样不会改变其余元素的相对顺序。

换句话说,我们可以对任意长度为偶数的区间 \([l,r]\) 做翻转

我们先考虑长度为 \(2\) 的区间。对于区间 \([i,i+1]\),其中 \(i = 2k+1\),分为几种情况:

  • $A_i = B_i = $ GH。此时是否交换都不会影响结果。
  • $A_i = $ G,$B_i = $ H。此时这个区间需要交换。
  • $A_i = $ H,$B_i = $ G。此时这个区间不需要(不能)交换。

于是对于所有第二类区间,我们都进行交换。这样艺术度的最大值就确定了。接着考虑求次数。我们把上述区间分别记为 \(1,2,3\)。那么连着的 \(1,2\) 可以一起操作,遇到 \(3\) 就将先前的 \(1,2\) 计入答案即可。注意特判 \(l=1\) 的情况。是线性的。

动态规划

  • 在要求最小化操作次数,也要最小化代价时,可以考虑给操作赋上一个极大的代价。(P6647)

P6647

很神仙的 dp。

考虑朴素的 dp。显然我们有 \(t = \lceil \frac{n}{k} \rceil\)。令 \(f_{i,j}\) 表示前 \(i\) 个景点,分了 \(j\) 天。转移时只需枚举 \(l \in [i - k, i - 1]\) 作为第 \(j - 1\) 段的结尾元素,从 \(f_{l,j-1}\) 转移即可。朴素转移做到 \(\mathcal{O(n^2k)}\)。得不到什么分数。

优化状态。对于 \(i\) 个景点,我们要让浏览的天数最小,那么必定分成 \(\lceil \frac{i}{k} \rceil\) 天。于是 \(f_i\) 表示前 \(i\) 个景点,分成 \(\lceil \frac{i}{k} \rceil\) 天的最大得分。你发现这不好 dp,怎么让天数最小呢?一个 trick 是给每次加天时赋上一个极大的代价。那么转移方程就是

\(f_i = \max\{f_j + \max(a_{j+1},\cdots,a_i) - \infin\}\),其中 \(j \in [i - k, i - 1]\)

这样是 \(\mathcal{O(nk)}\) 的。可以多得到一些分数。

显然只能在转移上做文章了。我们现在对于每个 \(i\),需要求 \(j \in [i-k,i-1]\)\(\max\{f_j + \max(a_{j+1},\cdots,a_i)\}\)\(f_j\) 很好维护,重点是后面的 \(\max(a_{j+1},\cdots,a_i)\)。考虑 \(i \to i + 1\) 时有啥影响?其实就是前面的某些 \(j \in [i + 1 - k, i]\)\(\max(a_{j+1},\cdots,a_{i})\) 可能会变成 \(a_{i+1}\)。也就是假设前面第一个 \(\ge a_{i+1}\) 的位置 \(p\)\([p, i + 1]\) 会被影响。

对于 \(i\) 的更新,单调栈维护前面 \(\le a_i\) 的数。单调栈很好的性质,假设当前栈顶为 \(x\),栈顶下面的元素是 \(y\),那么 \([y, x)\) 的影响是一样的,都是 \(a_i - a_x\)。sgt 区间维护即可。

指路:Sol

P1668

简单题。dp 考虑 \(f_i\) 表示时间 \([1,i]\) 被覆盖的最小代价。转移时对于右端点为 \(i\) 的区间取左端点最靠左的,令其为 \(j\)。那么有 \(f_i = \min(f_{j-1}, f_{j}, \cdots f_{i-1}) + 1\)。sgt 维护区间 max 单点修改即可。时间复杂度 \(\mathcal{O(n\log T)}\)

当然也有图论做法。具体地对于 \([l,r]\),从 \(l-1 \to r\) 连一条边权为 \(1\) 的边。然后对于 \(i \to i + 1\) 连一条边权为 \(0\) 的边。01 bfs 可以做到 \(\mathcal{O(T + n)}\)

贪心做法。令当前最后没被覆盖的点为 \(S\)。我们找到所有区间中覆盖了 \(S\) 的区间,取这些区间右端点的最大值 \(T\),然后令 \(S \leftarrow T\) 即可。这样是 \(\mathcal{O(n\log n)}\) 的。

P6146

很牛啊。

dp 考虑 \(f_i\) 表示前 \(i\) 条线段的答案。

考虑选/不选当前线段:

  • 不选。答案仍然为 \(f_{i-1}\)
  • 选。考虑哪些东西是不变的,哪些变了。发现哪些不变的取决于当前线段有没有覆盖之前的线段。这个计算起来很麻烦,于是我们把线段按左端点从左到右排序。这样加入 \(i\) 原来任意子集的复杂度都不会减少!不变的东西就是 \(f_{i-1}\)!哪些变了呢?计算出前面有 \(k\) 条线段与 \(i\) 不交,那么 \(i\) 增加的贡献就是 \(2^k\)。也就是说,这 \(k\) 条线段随便选,再加上 \(i\)\(i\) 总会有 \(1\) 的贡献。

综上,\(f_i = f_{i-1} + (f_{i-1} + 2^k) = 2f_{i-1} + 2^k\)\(k\) 维护可以用优先队列。

图论

P2149

被创飞了。

人话就是求无向图中,两对点间最短路的最长公共路径。

容易证明这个最长公共路径一定是一条链。否则如果有两个及以上连通块的话,由于无向图,两点间最短路一样,可以通过替换使答案更大。

考虑把同时在 A,B 最短路上的边加入图,跑一遍 topo 即可。

计数

P8106

这个数据范围首先考虑 dp,但是由于我们关心的 \(|S|\)\(|T|\) 在最后才能确定,难以进行 dp。

考虑直接枚举我们关心的 \(|S|\)\(|T|\)。我们枚举 \(|S|=k\),那么有 \(|T|=n-k\)。由于元素顺序不影响答案,考虑从小到大选。那么集合 S 的方案数就是 \(C(n-1,k)\)。然后考虑 T,你发现我们不知道 \(n-k\) 有没有被选。这是很难受的。于是在计算 S 时考虑这个就好了。

那么枚举 \(k\),当 \(k=n-k\) 时显然无解。否则方案数为 \(C(n-2,k-1)\)。即除了 \(k,n-k\) 之外选 \(k-1\) 个。

P14636

清仓甩卖。心魔。

Sub1

考虑 \(m=2\)。考场降智这个都不会。

考虑容斥转化为不合法方案数。

\(A\) 从大到小排序。不影响答案。

首先遇到 \(2\) 直接买是优的。容易证明。

问题在于可能有两个 \(1\) 不如一个 \(2\)。但是 \(2\) 夹在两个 \(1\) 中间,没钱买于是就倒闭了。

记两个 \(1\) 分别为 \(x,z\)\(2\)\(y\)。注意我们是买了 \(x\) 没钱买 \(y\) 才倒闭了,然后又买了 \(z\)。那么有 \(A_x + A_z < A_y\),并且 \(A_x > \frac{A_y}{2} > A_z\)

考虑枚举 \(x,z\),由于要让 \(x\) 第一个被考虑,有 \(\frac{A_1}{2} < A_x\),并且我们给 \([1,x)\) 都标上 \(2\)

然后我们判断是否存在 \(y\) 使得 \(A_x + A_z < A_y\),由于 \(A\) 降序令 \(y = A_1\) 判断即可。若存在,我们给 \((x, z)\) 中的数标上 \(2\),给 \((z,n]\) 随便标。方案数就是 \(2^{n-z}\)。时间复杂度 \(\mathcal{O(n^2\log n)}\)。结合暴力和性质 A 拼好分获得 48pts。

Sub2

推广一下。原问题中你发现你没办法确定 \(y\)。考虑去枚举它,\(y\) 的含义是第一个倒闭的物品。我们只需要凑出 \(m - 2\) 块钱,剩下的当 \(m = 2\) 做即可。预处理组合式即可 \(\mathcal{O(n^3)}\)。结合 Sub1 可获得 68pts。

for (ll L = 1; L <= m; ++ L ) // y 
{
	for (ll i = L + 1; i <= n; ++ i ) // x
	{
		if (A[L] / 2 >= A[i]) break; 
		for (ll j = i + 1; j <= n + 1; ++ j )
		{
			// [1, L) = L - 1 1/2  
			// (L, i) = i - L - 1 0/1 
			// -> m - 2 
			// m - 2 - (L - 1) = m - L - 1
			// i - 2
			// C(i - 2, m - L - 1) 
			s = add(s, (A[L] > A[i] + A[j]) * Calc(i - 2, m - L - 1) * pw2[max(0ll, n - j)] % mod); 
		}
	}
} 

正解

观察式子发现对于定的 \(L,i\),我们只关心满足 \(A_L - A_i > A_j\)\(j\)\(\sum 2^{\max(0,n-j)}\)。显然可以双指针找到满足条件的最大的 \(j\),做前缀和即可。时间复杂度 \(\mathcal{O(n^2)}\)

for (ll L = 1; L <= m; ++ L ) // y 
{
	ll k = n + 2; 
	for (ll i = L + 1; i <= n; ++ i ) // x
	{
		// Ai -- Aj ++
		if (A[L] / 2 >= A[i]) break; 
		while (A[L] > A[i] + A[k - 1] && k > i + 1) -- k; 
		k = max(k, i + 1);  
		// A[L] > A[i] + A[k] maxk 
		
		// A[L] - A[i] > A[k] 
//				ll k = find(i + 1, n + 1, A[L] - A[i]); 
		if (k == n + 2) h = 0;
		else h = pre[n - k + 1]; 
		
		s = add(s, h * Calc(i - 2, m - L - 1) % mod); 
	}
} 

第 3k 发提交!打破心魔!

P6561

妙妙题哦。

很巧妙的转化:我们把这 \(2m\) 个数分为 \(m\) 组。每组只有三个状态:选奇数(记为 A)、选偶数(记为 B)、都不选(记为 C)。

将状态看作物品。这样就相当于有 \(a\) 个 A,\(b\) 个 B,\(m - a - b\) 个 C,把这些物品排列的方案数,其中不能出现 BA。

由于 B、A 间有约束,一个常见的套路是先把 C 和 A(当然 B 也可以,同理的)排列好,再把 B 插进去。先考虑 C 和 A 任意排列的方案数:在 \(m - b\) 个空位里选出 \(a\) 个放 A。也就是 \(\binom{m-b}{a}\)

再考虑把 B 插进去。由于 B 不能紧挨在 A 前面,于是 B 只能放在 C 前面或者最后面。也就是在 \(m - a - b + 1\) 个空位里,放 \(b\) 个物品,允许空位为空的方案数。插板法得 \(n\) 个球放 \(k\) 个盒子里,方案数为 \(\binom{n + k - 1}{k - 1}\)。此时 \(n = b\)\(k = m - a - b + 1\)。于是方案数就是 \(\binom{m - a - b + 1 + b - 1}{m - a - b + 1 - 1} = \binom{m - a}{m - a - b} = \binom{m-a}{b}\)

两式相乘即可。即 \(\binom{m - b}{a} \times \binom{m - a}{b}\)。预处理阶乘计算即可。

P5505

容斥原理板题!我不会!

考虑容斥。考虑容斥。考虑容斥。

至少这个条件很 sb。考虑反着做。\(f_i\) 表示至少 \(i\) 个人没分到东西。那么剩下 \(n-i\) 个人爱给不给。对于每种物品相当于 \(n - i\) 个盒子,\(a_j\) 个球,盒子可以为空。插板法可知方案数为 \(f_i = \prod_{j=1}^m\binom{n-i+a_j-1}{n-i-1} \times \binom{n}{i}\)

考虑怎么变成答案。记 \(g_i\) 表示恰好有 \(i\) 个人没分到东西。答案即为 \(g_0\)\(f\)\(g\) 有什么关系呢?

以样例为例子:

首先有 \(f_0 = g_0 + g_1 + g_2 + g_4\)。但是在计算 \(f_1\) 的时候,你发现 \(f_1 \ne g_1 + g_2 + g_3 + g_4\)。是因为在计算至少 \(1\) 个人得不到东西时,假设当前钦定 \(x\) 得不到,总会有一种情况是 \(y\) 得不到,然而在钦定 \(y\) 得不到时总有一种情况是 \(x\) 得不到。这样就计算了两次,于是我们默认 \(f_1\) 有两个 \(g_2\)。手模发现

\[f_0 = g_0 + g_1 + g_2 + g_3 + g_4 \\ f_1 = g_1 + 2g_2 + 3g_3 + 4g_4 \\ f_2 = g_2 + 3g_3 + 6g_4 \\ f_3 = g_3 + 4g_4 \\ f_4 = g_4 \\ f_5 = 1 \]

然后计算 \(g_0 = f_0 - f_1 + f_2 \cdots = \displaystyle \sum_{i=0}^{n-1} (-1)^i f_i\)

做完了。

P3223

一开始想错了。老师是可以被女同学隔开的。分两部分:

  1. 老师被男同学隔开。答案为 \(\binom{n+1}{2} \times \binom{n+3}{m} \times n! \times m! \times 2!\)
  2. 老师被女同学隔开,但不被男同学隔开。答案为 \(\binom{n+1}{1} \times \binom{n+2}{m-1} \times n! \times m! \times 2!\)

做完了。

另一种方法是容斥。不考虑老师相邻 - 考虑老师相邻的。

不考虑老师相邻,把老师当作男同学,那就是 \(\binom{n+3}{m} \times m!\)

考虑相邻,那就是 \(\binom{n+2}{m} \times m!\)

两式子相减即为答案。

数学

P10320

式子题。

发现 \(a_i = \displaystyle \frac{x^{2^i}}{2^{2^i - 2}}\)。记最终答案为 \(t\)

\[\displaystyle \frac{x^{2^t}}{2^{2^t - 2}} \ge 2^n \\ 2^t\log_2x - (2^t - 2) \ge n \\ (\log_2x - 1)2^t \ge n - 2 \\ \]

  • \(x = 2\)。此时 \(n \le 2\) 时有解。若 \(n = 2, x = 1\)。若 \(n = 1, x = 0\)
  • \(x \ne 2\)\(t = \displaystyle \log_2(\frac{n-2}{\log_2x - 1})\)

直接计算即可。

ABC420G

推式子题。

\(m = \sqrt{n^2 + n + X}\)。开始推柿子:

\[m = \sqrt{n^2 + n + X} \\ m^2 = n^2 + n + X \\ n^2 + n - m^2 = -X \\ (n + \frac{1}{2})^2 - m^2 - \frac{1}{4}= -X \\ (n+\frac{1}{2} + m)(n + \frac{1}{2} - m) = -X + \frac{1}{4} \\ (2n+1+2m)(2n+1-2m) = -4X + 1 \]

枚举 \(-4X + 1\) 的因子即可。

posted @ 2026-05-23 18:12  RainyRadio  阅读(11)  评论(0)    收藏  举报