Q:弟啊你 NEERC 2015 咋还没做完呢
A:咕了(指太菜看不懂题解)
2016-2017 ACM-ICPC Northeastern European Regional Contest (NEERC 16)
- B - Binary Code
- C - Cactus Construction
- D - Delight for a Cat
- G - Game on Graph
- I - Indiana Jones and the Uniform Cave
- K - Kids Designing Kids
- L - List of Primes
- M - Mole Tunnels
C - Cactus Construction
题意简述
给定一棵仙人掌($n\le 5\times 10^5$),你需要构造它。
初始时,每个点颜色都为1
,每个点都是仅有一个点的子图。
你有三种操作:
- $join(u, v)$:把子图 $v$ 合并进子图 $u$。
- $connect(u, a, b)$:把子图 $u$ 中颜色为 $a$ 的所有点与颜色为 $b$ 的所有点连边。
注意若原本存在颜色 $a$ 的点与颜色 $b$ 的点之间有边,会连出重边,然而众所周知仙人掌是没有重边的,所以要避免这种情况。 - $recolor(u, a, b)$:把子图 $u$ 中颜色为 $a$ 的所有点改为颜色 $b$。
假设你的操作数量是 $m$,操作间出现过的颜色数量是 $c$,那么你需要保证 $m\le 10^6, c\le 4$。
主要思路
考虑树怎么做。从下往上合并,保证子树内只有根的颜色是 $2$,其他都是 $1$。合并一个儿子的时候把儿子改成颜色 $3$,合并连上后,再把颜色 $3$ 改成 $1$。
考虑环怎么做。我们选定一个「根」,那么剩下的部分就是一条链。
我们把链头染成颜色 $2$,在接入下一个点时选择一个链上当前未出现的颜色 $c$,把新接入的点染成该色,再把另一色的原本的链尾和新接入的点连边,再把原本的链尾改成颜色 $1$。
整条链做完后,把链尾染成颜色 $2$,用类似合并儿子的方法接入「根」即可。
参考代码
1 |
|
G - Game on Graph
题意简述
一张有向图,两人0
,1
在玩游戏。游戏规则非常简单:图上有一棋子,两人轮流操作,每人每次将棋子沿当前位置的某条出边移动,不能动的人就输了。
但是由于一些特殊原因,0
最希望游戏永远不要停止;若无法达到,其也会尽可能追求赢。1
最不希望游戏永远不停止;若可以使游戏停止,其宁愿输。
现在请对于每个点作为棋子的开始点,每个人作为先手,求最后的状态是什么(赢/输/无法结束)。
$n\le 10^5, m\le 2\times 10^5$。
主要思路
设一个游戏状态为一个二元组 $(x, c)$ 表示当前棋子在点 $x$,此时操作的是 $c$。0
若1
无论如何操作都可以使游戏无法结束,他就会令游戏无法结束;否则1
会阻止游戏无法结束。1
若0
无论如何操作都可以自己赢,那他会使自己赢;否则0
会阻止1
赢。
而其余的情况,0
会赢。
考虑清楚这一点之后,就可以设 $ending(x, c), winning(x, c)$ 分别表示 $(x, c)$ 状态能否结束、1
能否赢。
考虑用反向 bfs 来求 $ending$。
首先,显然对于所有没有出度的状态 $(x, c)$,它们均能结束。把这些状态全扔队列里。
考虑 $(x, 1)$ 如何能够结束:只要它的下一个可能状态中有一个可以结束,它就能结束;
而 $(x, 0)$ 要结束,必须要它的每一个下一个可能状态都可以结束。
同样用反向 bfs 来求 $winning$,可以发现转移方式完全一致。
参考代码
1 |
|
K - Kids Designing Kids
题意简述
给你三个01
矩阵 $A, B, C$。
问是否能够通过平移 $B$ 并与 $A$ 异或(并删去全为0
的部分行列)获得 $C$。若是顺便输出 $B$ 的平移方法。
$w, h\le 10^3$。
主要思路
完全没思路,看了一眼题解。
Find the top-left freckle in each of three given pictures.
We’ll prove that after moving the figures, some two of these three freckles must be in the same point.
大概就是说:三个最左上的1
有两个移动后在同一位置。于是检验三种就可以了。
被打傻了.jpg
参考代码
1 |
|
L - List of Primes
题意简述
现在有无穷个(不可重)集合,每个集合中全都是质数。把它们先按照元素总和、再按照字典序排序。
每个集合输出,集合开始先输出[
,集合结束输出]
,无论两个元素还是两个集合之间都要用,
连接。
则会形成一个无限长的字符串,下列为前70
个字符。
1 | [2], [3], [2, 3], [5], [2, 5], [7], [3, 5], [2, 7], [2, 3, 5], [3, 7], |
求第 $l$ 到第 $r$ 个字符,$l,r\le 10^{18}, r - l\le 10^5$。
主要思路
猜想集合的和不会太大(事实证明是2099
)。
于是直接类似背包地 dp 一下即可。
参考代码
1 |
|
M - Mole Tunnels
题意简述
有一棵 $1$ 为根 $n$ 个点边全为 $(i, \lfloor\frac{i}{2}\rfloor)$ 的树。
树上每个点有食物 $c_i$。有 $m$ 只鼹鼠,分别在点 $p_i$。
对于每个 $k\le m$ 求:若前 $k$ 只鼹鼠都去找一个食物(即点 $x$ 不能有超过 $c_x$ 只鼹鼠),鼹鼠的总路程最小是多少。
$n, m\le 10^5$,保证食物够。
主要思路
某人表示:这不是经典题吗
我一看,Luogu 6122
怎么做啊,自闭了。
首先有个简单的费用流思路:
- 总路径长度:所有树边流量为正无穷,费用为 $1$。
- 鼹鼠的终点要有食物:相当于 $i$ 向汇点连一条流量为 $c_i$ 费用为 $0$ 的边。
- 进入一只鼹鼠:相当于源点向 $p_i$ 连一条流量为 $1$ 费用为 $0$ 的边。
考虑费用流的过程。
新加入一只鼹鼠时,设其出发点为 $u$,到达的点为 $v$,则我们会在 $u$ 到 $v$ 的路径经过的每条边上建一条费用为 $-1$ 流量为 $1$ 的反向边。而对 $v$ 的选择,其实就是选使得 $u\to v$ 路径上总费用最小(且 $v$ 到汇点的边未流满)的点 $v$。
注意到二叉树的树高为 $O(\log n)$,所以可以暴力枚举 $u$ 的所有祖先 $a$。对每个节点 $a$,维护 $a$ 子树内使得 $a\to v$ 路径上总费用最小(且 $v$ 到汇点的边未流满)的点 $v$,记为 $pos(a) = v$。
对于所有祖先 $a$,取 $pos(a)$ 中最优的一个,作为真实的 $v$。然后在 $u\to v$ 的路径上添加反向边,并更新 $u, v$ 及其所有祖先的 $pos$ 即可。
$O(n\log n)$。
参考代码
1 |
|