IOI 2015 集训队作业选做

[USACO13OPEN Gold] Figure Eight

题面

暴力题。

枚举左右边界,从下往上递推,可以得到每一行这一左右边界向下最多扩展多少;同样从上往下递推可以得到向上最多扩展多少。

然后枚举中间那一行,按照左端点扫描线,用一个树状数组维护后缀 \(\max\)。复杂度 \(\mathcal{O}(n^3\log n)\)

事实上有点蠢。只需要用 DP 数组记录向上 / 下最多扩展多少,并且向上的状态记录的值把它包含的区间的 DP 值全部取 \(\max\) 就行了。

卡空间用 short。

https://paste.ubuntu.com/p/fst6mP66FP/

[USACO12OPEN Gold] Photo

题面

考虑 DP。设 \(f_i\) 表示最后一个有斑点的奶牛是 \(i\),已经考虑的区间全部合法的方案数。

考虑 \(i\)\(j\) 处转移而来,需要满足什么条件。不难发现其实就是 \([j+1,i-1]\) 不包含任何一个区间,并且 \([j,i]\) 没有被任何一个区间包含。这个可以记录 右端点 \(< i\) 的区间中最靠右的左端点 和 右端点 \(\ge i\) 的区间中最靠左的左端点来找到。所以就是一个线段树优化转移的板子了。

https://paste.ubuntu.com/p/mjyhtk7MXC/

[USACO09JAN Gold] Safe Travel

题面

考虑图的最短路树。因为这题给定的性质所以这棵最短路树是唯一的。

然后有一个观察,就是答案会且仅会经过一条非树边。证明考虑反证。

所以只需要把所有非树边 \((u,v,w)\) 拿出来,看它能更新多少个点的答案。

显然只会更新树上 \(u\to v\) 最短路径上的点,且这个更新的值为 \(dis_u+dis_v+w-dis_i\),其中 \(i\) 为要更新的点。

并查集可以方便地维护这个过程。

https://paste.ubuntu.com/p/pvgsTcCgkB/

[CodeJam 2014 Finals C] Symmetric Trees

题面

给一棵 \(N\) 个节点的树(\(N\le 10^4\)),每个节点有一个颜色(颜色最多 \(26\) 种),现在问它是不是对称的。对称的定义是,能把这棵树放在一个平面上,\(x =0\) 为对称轴,若在 \((x, y)\) 处有一点 \(v\),那么在 \((−x, y)\) 处就一定有一个相同颜色的点 \(v'\)(如果 \(x =0\) 则它们为同一点),并且对于所有边 \((u, v)\)\(u'\)\(v'\) 间也一定有边。共\(T\) 组数据,\(T\le 100\)

https://paste.ubuntu.com/p/ZbgCPDB3JZ/

[CF356E] Xenia and String Problem

题面

https://www.luogu.com.cn/blog/chenggeorshidao/solution-cf356e

https://paste.ubuntu.com/p/gK6SM3MXHQ/

[CF343E] Pumping Stations

题面

最小割树的应用。

第一问就是最小割树边权和。

第二问的构造,可以考虑把边权最小的边断开,然后分成两个点集,对这两个点集分别求解再把它们直接接上就行了。

https://paste.ubuntu.com/p/jcs2Pmmx49/

[CF338E] Optimize!

题面

考虑把所有 \(b_i\) 变成 \(h-b_i\),然后将 \(b_i\) 从小到大排序,并将当前要匹配的 \(len\)\(a_i\) 也从小到大排序,那么能匹配的条件就是 \(\forall i,a_i\ge b_i\)

这个在值域上的表达就是,把 \(b_i\) 所在位置的权值看成 \(1\)\(a_i\) 所在位置权值看成 \(-1\),那么每个位置的前缀和 \(\ge 0\)

离散化后线段树动态维护这个过程即可。

https://paste.ubuntu.com/p/DbHqCdfYNy/

[CF338D] GCD Table

题面

显然 \(i\)\(\operatorname{lcm}(a_1,a_2,\dots,a_k)\) 的倍数。

进一步的,如果有解那么 \(i\) 一定就是 \(\operatorname{lcm}(a_1,a_2,\dots,a_k)\)

对于 \(j\) 的求解,我们可以列出 \(k\) 个同余方程,然后用 exCRT 得到解的值。

最后代入检验。

https://paste.ubuntu.com/p/6pqBfNfXGm/

[CF335E] Counting Skyscrapers

题面

https://blog.csdn.net/zxyoi_dreamer/article/details/102313266

https://blog.csdn.net/cqbzlydd/article/details/130871979

https://paste.ubuntu.com/p/KNfS3Y8F9q/

[CF335F] Buy One, Get One Free

题面

反悔贪心。

直接看 洛谷题解

那个“如果我们将 \(x\) 买下,然后来白嫖 \(a_i\),那就可以相较于买下 \(a_i\),净赚 \(2\times a_i\)”的意思,拿样例一来解释就是说,现在假如已经白嫖了两个 \(4\),接下来扫到了两个 \(3\),原则上这两个 \(3\) 都是不能白嫖的,这个反悔操作的意思就是把一个 \(4\) 不白嫖了,这样可以 \(5-4,5-3,4-3\) 配对。

https://paste.ubuntu.com/p/YMd7w7PzwC/

[CF332D] Theft of Blueprints

题面

对于 \(k=1\) 的情况,我们可以直接枚举每个点和它相邻的边计算贡献。

对于 \(k=2\) 的情况,考虑枚举那一个中转点和它的一条连边,那么这条边的贡献就是枚举点的度数 \(-1\)。直接计算就行。

对于 \(k\ge 3\) 的情况,可以证明图是一个有 \(k+1\) 个点的完全图。证明见洛谷题解。

https://paste.ubuntu.com/p/CZqz4bTFdJ/

[CF331E1] Deja Vu

题面

找到一条边,使得它的顶点序列里包含这条边,然后向两边直接搜索。这样可以找到极短路径。

https://paste.ubuntu.com/p/sDbJWGMW6T/

[CF331E2] Deja Vu

题面

状态机 DP。

找到所有合法的链,然后直接根据链头链尾的匹配状态设计 DP 状态。

https://www.luogu.com.cn/blog/sysblogs/solution-cf331e2

[CF325E] The Red Button

题面

首先奇数无解。证明考虑设 \(n=2k+1\),那么 \(n\)\(n-1\) 都只能由 \(k\) 转移过来,这样 \(k\) 就肯定会用两次,所以无解。

注意到 \(i\)\(i+\frac{n}{2}\) 的连边方式相同。而且如果我们只考虑 \(i<\frac{n}{2}\) 的点的连边,那么它会是一棵完全二叉树。

接下来可以参考 https://yyyyxh329.blog.luogu.org/solution-cf325e

https://paste.ubuntu.com/p/QS264sk2HN/

[CF325C] Monsters and Diamonds

题面

主要参考 https://www.cnblogs.com/jucason-xu/p/17406252.html

感觉是一道鬼畜的细节题。

https://paste.ubuntu.com/p/2qx7hSmkQj/

[CF321D] Ciel and Flipboard

题面

https://www.luogu.com.cn/blog/eulogized/solution-cf321d

key observation:设 \(rev_{i,j}=0/1\) 表示 \((i,j)\) 是否翻转,那么有:

\[\forall 1\le i,j<m,rev_{i,j}\oplus rev_{i,m}\oplus rev_{i,j+m}=0, rev_{i,j}\oplus rev_{m,j}\oplus rev_{i+m,j}=0 \]

枚举第 \(m\) 列的前 \(m\) 个元素,然后就可以推出第 \(m\) 列的所有值。

枚举第 \(m\) 行的前 \(m-1\) 个元素,发现它们之间是独立的!

所以可以继续枚举这一列的前 \(m-1\) 个元素,然后得到四个位置的信息,把若干种分配方式取 \(\max\) 就行了。

https://paste.ubuntu.com/p/xgZCQVMJ9q/

[CF319E] Ping-Pong

题面

直接看 https://www.luogu.com.cn/blog/hongzy/solution-cf319e

做法比较依赖于加入的区间长度单调递增的性质。

https://paste.ubuntu.com/p/jXCrhdXvc3/

posted @ 2023-06-19 15:16  csxsi  阅读(16)  评论(0)    收藏  举报