2023 国家队集训 @ 威海 做题笔记

Day 1

【CCO 2023】Flip it and Stick it

观察数据范围和部分分,\(|T| \leq 3\),很明显需要分讨。

  1. \(T=1\)

过于简单。

  1. \(T=2,S=00\)

相当于不能有连续的 \(0\)。无解易判,之后每次翻转可以把一个 \(1\) 插到相邻两个 \(0\) 中间,有解条件保证了每次都可以操作,答案就是 \(00\) 的个数。

  1. \(T=2,S=01\)

那么最终串肯定形如 \(11...1100...00\),考虑原串的极长相同连续段,那么一次操作可以把一段后面的 \(1\) 翻到前面去,答案就是 \(01\) 的个数。

  1. \(T=3,S=010\)

相当于不能有长度为 \(1\)\(1\) 连续段,每次操作可以把一个单独的 \(1\) 翻过去与另一段 \(1\) 拼接,答案就是 \(010\) 的个数除以 \(2\) 上取整。

  1. \(T=3,S=001\)

那么最终串肯定形如 \(0101...0100000\),考虑原串的极长相同连续段,在最后一段的 \(0\) 是合法的,对于前面的长度 \(>1\)\(0\) 连续段,可以把它翻到后面与最后一段 \(0\) 拼接,答案就是 \(001\) 的个数。

  1. \(T=3,S=000\)

这种情况比较复杂,相当于不能有长度 \(>2\)\(0\) 连续段。在理想情况下,我们可以用一次操作将一段 \(0\) 连续段的 \(2\)\(0\) 分割出去,前提是存在两个连续的 \(1\),这样才能保证剩下的 \(0\) 不会和其它 \(0\) 合并。如果不存在连续的 \(1\),那就可以利用 \(101\),用一次操作分割出去 \(1\)\(0\),如果还没有就无解。所以只需贪心使用第一种操作,注意长度为 \(3\)\(0\) 连续段可以只使用第二种操作。

【CCO 2023】Travelling Trader

同样观察到 \(K \leq 3\),也可以分讨。

\(K=1\) 是一条链,选最深叶子就行了。

\(K=3\) 可以分层跳。具体来说,考虑 \(u\) 的子树,先从 \(u\) 跳到某个儿子 \(v\) 的儿子,把 \(v\) 的儿子蹦跶完(是个子问题)再跳回 \(v\) ,之后再跳到另一个儿子的儿子……以此类推。所以所有点都可以跳到。

\(K=2\) 比较经典,可以树形 dp。设 \(f_{u,0/1}\) 表示从 \(u\) 出发,最后不上来/上来的最大权值和,\(g_{u,0/1}\) 表示从 \(u\) 的父亲出发,最后不上来/上来的最大权值和。转移较为繁琐:

\(f_{u,1} \leftarrow a_u+\sum a_v\) —— 走一遍所有儿子

\(f_{u,1} \leftarrow a_u+g_{v_1,1}+\sum\limits_{v\neq v_1} a_v\) —— 选一个儿子走下去,再上来走其他儿子

\(f_{u,0} \leftarrow a_u+g_{v_1,0}\) —— 选一个儿子直接走

\(f_{u,0} \leftarrow a_u+g_{v1,1}+\sum\limits_{v\neq v_1,v_2} a_v+g_{v2,0}\) ——选一个儿子走下去,再上来走其他儿子,最后选一个儿子走下去

\(g_{u,1} \leftarrow \sum a_v+a_u\) —— 走一遍所有儿子再回到 \(u\)

\(g_{u,1} \leftarrow \sum\limits_{v\neq v_1} a_v+f_{v_1,1}+a_u\) —— 先走其他儿子,再选一个儿子走下去,最后回到 \(u\)

\(g_{u,0} \leftarrow f_{u,0}\) —— 摆烂,当 \(f\)

\(g_{u,0} \leftarrow \sum\limits_{v\neq v1,v2}a_v+f_{v_1,1}+a_u+g_{v_2,0}\) —— 先走其他儿子,然后选一个儿子走下去,再上来走 \(u\),最后选一个儿子走下去

\(g_{u,0} \leftarrow \sum\limits_{v\neq v1,v2,v3}a_v+f_{v_1,1}+a_u+g_{v_2,1}+f_{v_3,0}\) —— 先走其他儿子,然后选一个儿子走下去,再上来走 \(u\),之后选一个儿子走下去,上来,最后再选一个儿子走下去

方案同样可以通过 dp 求出。可能有更好的 dp 状态/转移方法。

【CCO 2023】Triangle Collection

先转判定性问题,假设已经知道了每个长度的木棍有多少对是腰,由于一对长为 \(l\) 的腰能匹配任意长度在 \([1,2l-1]\) 的底,所以根据 Hall 定理,\(\leq l\) 的腰的对数要小于等于 \(\leq 2l-1\) 的底的个数。

将底看作 \(+1\),腰看作 \(-1\),一条长度为 \(l\) 的底就在 \(l\)\(+1\),一对长度为 \(l\) 的腰就在 \(2l-1\)\(-1\),那么合法当且仅当所有前缀和 \(\geq 0\)

不妨先让腰的对数尽可能多,找到这时的前缀最小值位置 \(pos\),那么每次将一对长为 \(l\) 的腰变为两个底就会使 \(2l-1\)\(+1\)\(l\)\(+2\)。为了使贡献最大化,每次操作的 \(l\) 必然要满足 \(2l-1 \leq pos\),这时会让前缀最小值 \(+3\)。不难发现一定存在这样的 \(l\),且取最小的这样的 \(l\) 会使得 \(pos\) 在操作完后仍然是前缀最小值。所以答案就是前缀最小值取负后除 \(3\) 上取整。用线段树维护可做到 \(\mathcal O(n\log n)\)

Day2

【CEOI2005】Depot Rearrangement

感性理解一下,每个商店只会对多出来的数进行交换操作,因为把一个已经合法的数当作中转点,不如让那个数直接交换到自己想要的位置。

所以对每个商店和每种物品都建一个点,一个商店多了什么物品就往对应物品种类连边,少了什么物品就从对应物品种类向自己连边。最后会得到一张图,对每个连通块跑欧拉回路就行了。

由于图的特殊性,每次随便找一条边走就可以了。

【KOI2023】野餐

妙妙题。

先考虑只有早上,要求相邻两个人写的数不一样。不妨设看到两个数是 \(x,y\) 的时候写下的数字是 \(f(x,y)\),那么要求相当于对所有 \(x\neq y,y\neq z\)\(f(x,y)\neq f(y,z)\)

写出 \(x,y\) 的二进制表示,因为 \(x \neq y\),所以一定有一位不同,返回这一位和 \(x\) 在这一位上的数就行了,可以做到 \(2\log n\)

那能不能不返回 \(x\) 在这一位的数?将 \(N\) 个数都映射到一个恰好有 \(k\)\(0\)\(k\)\(1\) 的二进制串,且互不相同,这样的串有 \(\binom{2k}{k}\) 个。那么我们一定可以找到一个 \(x,y\) 不一样且 \(x\) 在这一位上为 \(0\) 的位,返回这一位就行了。

中午和晚上也一样,只不过能看到三个数 \(x,y,z\),多迭代几次返回 \(f(f(x,y),f(y,z))\) 就行了,这样仍能保证互不相同。这样上界可以变成只有 \(4\) 位,但还不够。

考虑优化晚上的返回值。我们从中午得到了三个值在 \([0,3]\) 之间的数,如果自己的这个数 \(\leq 2\),直接返回;否则这一位为 \(3\) 且相邻两位都 \(\leq 2\),直接返回一个不同于相邻两位的 \(\leq 2\) 的数即可。

【KOI2023】外环路 2

没有奇环等价于是一张二分图,可以黑白染色。

于是设 \(f_{u,0/1,0/1,0/1}\) 表示 \(u\) 子树内,\(u\) 的颜色、最左边叶子颜色和最右边叶子颜色分别是什么的最小代价。时间复杂度 \(\mathcal O(n)\)

Day3

【RMI 2020】Peru

有一长为 \(n\) 的序列 \(a\),每次可以花 \(E\) 的代价将一段长为 \(k\) 的区间内所有 \(\leq E\) 的数置为 \(0\),求最小代价使得所有数都为 \(0\)。你需要对每个前缀求答案。
\(1 \leq k \leq n \leq 2.5 \times 10^6\)TL=0.2s

不难得到 dp 做法:设 \(f_i\) 表示前 \(i\) 个数置为 \(0\) 的答案,每次枚举将哪一段区间置为 \(0\),有 \(f_i = \min\limits_{i-k \leq j < i}{f_j+\max(a_{j+1},\cdots,a_i)}\)

对于 \(\max\) 相同的一段,因为 \(f\) 单调不降,所以肯定取最前面的 \(j\) 转移,只要能维护出所有 \(\max\) 连续段并求出最大值就行了。

有一种经典做法是维护一个中点到两边的后缀/前缀最大值,每次删过中点就重构,复杂度 \(\mathcal O(n)\)

证明大概就是设势能为中点到两端的长度之差,每次 push/pop 最多使势能增加 \(1\),当势能到一定值后花 O(势能) 的时间重构。

【2022 克罗地亚国家队选拔】这么牛

给定 \(n\) 个数,每次可以把两个奇偶相同的数合并成它们的平均值。问是否能将所有数合并成一个数或判断无解。
\(T\) 组数据,\(\sum n \leq 10^6\)

比较奇怪的构造。

不妨把所有数按模 \(4\) 分成四类 \(S_0,S_1,S_2,S_3\)。如果只有偶数,那么只存在 \(S_0\)\(S_2\),每次把同一个集合里的两个数合并,合并出来的还是偶数。若合并到最后 \(|S_0|=|S_2|=1\),就把它们合并。

奇数同理,下面只考虑同时存在奇数和偶数的情况。

接下来证明若同时存在 \(S_0,S_2\) 或同时存在 \(S_1,S_3\) 则必定有解。不妨证明 \(S_0,S_2\) 的情况,\(S_1,S_3\) 的情况对称。

先单独把 \(S_0,S_2\) 里的任意两个数拿出来,设为 \(4a+0\)\(4b+2\),将其余的数任意合并。

若最后只剩下偶数,如果它属于 \(S_0\) 就先和 \(4a+0\) 合并成偶数,再和 \(4b+2\) 合并;反之同理。

若最后只剩下奇数,就先将 \(4a+0\)\(4b+2\) 合并成奇数,再和奇数合并。

若最后剩下一奇一偶,不妨设奇数等于 \(2c+1\),偶数属于 \(S_0\) 且等于 \(4d+0\),反之同理。

先将 \(4a+0\)\(4b+2\) 合成 \(2(a+b)+1\),再把它和 \(2c+1\) 合并成 \(a+b+c+1\),如果它是偶数就成功和 \(4d+0\) 合并。

否则先将 \(4d+0\)\(4b+2\) 合成 \(2(d+b)+1\),再把它和 \(2c+1\) 合并成 \(d+b+c+1\),如果它是偶数就成功和 \(4a+0\) 合并。

否则 \(a\)\(d\) 奇偶性相同,把它们合并成 \(4\frac{a+b}{2}+0\),再和 \(4b+2\) 合并成奇数,最后和 \(2c+1\) 合并。

接下来考虑如何构造两个 \(S_0,S_2\) 的数,\(S_1,S_3\) 同理。

找到最低的二进制位 \(d\) 使得所有偶数在这一位不全相同,随后将这一位为 \(0\) 的一个数和这一位为 \(1\) 的一个数合并,合并出来的数会满足在 \(d-1\) 位和其他数不同,以此做下去。

如果成功做到 \(d=2\) 就成功了。如果偶数和奇数都失败了,说明偶数无论如何合并都不能变成奇数,奇数也合并不成偶数,所以无解。

时间复杂度 \(\mathcal O(n\log V)\)

【2022 克罗地亚国家队选拔】这么不牛

你要猜一张点数为 \(100\) 的图,每次可以询问三个点,得到三个点之间有多少对点之间有连边。你需要在不超过 \(3400\) 次询问内求出答案。

考虑依次加入每一个点,在前 \(i-1\) 个点的所有边都求出来的情况下,求出第 \(i\) 个点与前 \(i-1\) 个点的连边情况。

每次询问 \((i,j,j+1)\),先减掉 \((j,j+1)\) 的贡献。如果是 \(0\) 或者 \(2\),那么两条边情况确定,令 \(j \leftarrow j+2\);否则这两条边恰有一条存在,继续询问 \((i,j+1,j+2)\),直到出现前一种情况,再倒推回去。

如果询问到最后都推不出来,那么询问 \((i,1,j)\) 或者 \((i,j,j+2)\) 就可以推出来,不过这需要 \(i \geq 4\)。将前 \(5\) 个点共 \(10\) 个变量根据 \(10\) 个方程暴力求出来即可。

随机打乱枚举顺序,就有约 \(\frac{1}{2}\) 的概率使 \(j\)\(2\),另外 \(\frac{1}{2}\) 的概率使 \(j\)\(1\),期望一次移动 \(1.5\) 步。所以期望询问次数为 \(\frac{n(n-1)}{3}\)

Day4

【CCO 2021】Travelling Merchant

有一张 \(n\) 个点 \(m\) 条边的有向图,你要从某个节点开始移动,其中第 \(i\) 条边要求你在走这条边前至少有 \(r_i\) 块钱,走过去则会获得 \(p_i\) 块钱。
对每个点求出它作为起点时,一开始至少需要多少钱才能在图上无限走下去。
\(n,m \leq 2\times 10^5\)

先思考 \(p_i=0\) 的部分分怎么做。一条路径的权值为所有边的的 \(r_i\) 最大值,那么题目等价于对每个点求出它到某个环的路径权值最小值。

首先走不到环的特判,之后考虑 \(r_i\) 最大值。如果一个点能不经过它走到其他环上,那么就赢了;否则必定经过它,答案就是当前 \(r_i\) 最大值。

具体来说,把最大值这条边删掉,如果有点走不到环,那么这个点的答案就是这个最大值。找走不到环的点可以通过不断删出度为 \(0\) 的点得到。

\(p_i \neq 0\) 也差不多,还是考虑 \(r_i\) 的最大值,如果有点的路径经过这条边,那么这条边之后的边肯定不会再产生约束

\(f_u\) 表示从 \(u\) 出发的答案,那么转移就是 \(f_u \leftarrow \max(r_{i},f_v-p_i)\)。每次找到 \(r\) 最大的边 \((u,v)\) 删掉,并将 \(f_u\)\(r\)\(\min\)。如果删完之后产生出度为 \(0\) 的边,那么它的 \(f\) 值就确定了,直接删掉并更新它的入度。

时间复杂度 \(\mathcal O(n+m\log m)\)

【CCO 2023】Real Mountains

有一个长为 \(n\) 的序列 \(a\),每次可以选一个三元组 \((i,j,k)\) 使得 \(a_j\) 加一,需要保证 \(i<j<k\) 并且 \(a_i>a_j<a_k\),代价为 \(a_i+a_j+a_k\)
求最小代价使得序列是单峰的(即 \(\exist 1 \leq p \leq n,a_1 \leq \cdots \leq a_{p-1} \leq a_p \geq a_{p+1} \geq \cdots \geq a_n\))。
\(3 \leq n \leq 10^6,1 \leq a_i \leq 10^9\)

考虑从最小值开始往上加,一种比较优的做法是将两个最小值 \(x\) 先抬到 \(x+1\),之后中间的 \(x\) 就只需要 \(3x+2\) 的代价。

手玩一下发现一定是先操作两端的最小值,再操作中间的,总共有两种选法,比较哪一种更优就行了。

使用线段树动态维护每个数前缀/后缀的最小的比它大的数,时间复杂度 \(\mathcal O(n\log n)\)

【CCO 2023】Line Town

给定长为 \(n\) 的序列 \(a\),每次可以将相邻两项交换并取反,求使得序列单调不降的最小操作次数。
\(1 \leq n \leq 5\times 10^5\)

设第 \(i\) 个数最终交换到了 \(p_i\) 位置,那么第 \(i\) 个数会变成 \((-1)^{|i-p_i|}a_i\),操作次数是 \(p_i\) 逆序对数。

先考虑 \(a_i\) 互不相同的部分分,那么按绝对值从大到小考虑,要么取负数放前面,要么取正数放后面。于是设 \(f_{i,j}\) 表示当前考虑到 \(i\),前面放了 \(j\) 个数的最小代价,转移的时候判断能否放前面/后面,再加上当前数与还没放的数之间的逆序对数就行了。

实际上转移的判断只与前面的个数奇偶性有关,于是设 \(f_{i,0/1}\) 表示当前考虑到 \(i\),前面的个数奇偶性为 \(0/1\) 的最小代价,数逆序对数用树状数组优化。

再考虑 \(|a_i| \leq 1\) 的部分分,最终序列一定形如一段 \(-1\),一段 \(0\) 再一段 \(1\)。将绝对值为 \(1\) 的分为两大类,一类可以配对左边奇数位的 \(-1\) 和右边偶数位的 \(1\),另一类同理。枚举左边有多少个 \(-1\),同一类的肯定是按顺序匹配,于是就知道了每个数的 \(p_i\)

考虑动态维护逆序对数。若 \(0\) 的个数为奇数,那么相当于每次把左边的 \(-1\) 移到右边的 \(1\),类别不变,只需计算 \(1\)\(0\) 之间的逆序对数变化量;若 \(0\) 的个数为偶数,那么每次会移两个数到右边,类别互换,只需计算 \(1\)\(0\) 的逆序对数变化量和这两个数类别交换产生的变化。

满分做法也差不多,按绝对值从大到小考虑,对绝对值相同的做 \(|a_i| \leq 1\) 的过程,不过需要额外枚举前面个数的奇偶性,单次复杂度与个数有关,总时间复杂度 \(\mathcal O(n\log n)\)

Day5

【IzhO 2017】Hard route

给定 \(n\) 个点的树,选出两个叶子,定义它们连成的路径的权值 \(H\) 为所有点到这条路径的距离最大值,你需要最大化 \(H\times\) 这条路径的长度,并求出取得最大值的叶子选取方案数。
\(2 \leq n \leq 500000\)

假设选出的路径为 \(u \to v\),距离这条路径最远的点为 \(w\),那么这三个点两两路径有交点 \(A\)

考虑枚举 \(A\) 为根,\(u,v,w\)\(A\) 的三个处于不同儿子子树的点,到 \(A\) 的距离分别为 \(a,b,c(a \geq b \geq c)\),那么代价最大的肯定是 \(a(b+c)\),即选取 \(v \to w\) 为路径。

于是处理出到 \(A\) 距离前三大的点的距离和点数,分类讨论一下即可。

不过有个问题,那就是同一条路径会不会在不同的 \(A\) 算多次。实际上不会,因为如果 \(v\to w\) 路径上的另一个点 \(A'\) 也将其算进了答案,那么存在另一个点 \(u'\)\(A'\) 距离为 \(a\);而这样 \(u'\)\(A\) 的距离就大于 \(a\) 了,与 \(a\) 是到 \(A\) 的距离最大值矛盾。时间复杂度 \(\mathcal O(n)\)

【IOI2009 中国国家队选拔】\(N^2\) 数码游戏

【2022 克罗地亚国家队选拔】Mapa

Day6

【KOI 2023】出租车

【UOI 2023】乌克兰

【2022 克罗地亚国家队选拔】喝喝粥

posted @ 2023-07-12 21:10  AFewSuns  阅读(427)  评论(0编辑  收藏  举报