葱油饼

https://qoj.ac/problem/17645

\(\mathcal O(n^{4.5}\log^{1.5}n)\) 做法

做了整整两天,至少十个小时,为啥我感觉这个题这么难啊???

update:好像确实有一万个简单做法,我怎么一个都没想到

描述一下最后的做法。

首先我们可以用前 \(2n-1\) 次询问(袋子)直接让每个人知道自己的编号。做法很简单:每个人吃掉自己能吃的第一个饼,最后一个人接收到的袋子中 \(0\) 的个数就是他的编号。这个的道理是,考虑到 \(0\) 的个数就是前面的人吃掉的饼个数,因此不会超过编号,而经过 \(2n-1\) 轮之后,可以保证前 \(n-1\) 个人都恰好吃了一个饼(因为每个口味出现次数不超过 \(n\)),所以恰好等于编号。

所有人都知道编号以后,我们就可以在全局规划一个统一的传信息的策略。问题大概是这样的:用 \((x,c)\) 表示接下来出现的第 \(c\)\(x\),则我们需要为每个 \(p_i\) 找到至少 \(\lceil \log_2 n\rceil\) 个不同的 \((x,c)\),满足 \(x\neq p_i\),并规定这些 \((x,c)\) 用来描述 \(p_i\) 这个值所在的位置。

考虑到只需要传出去 \(n-1\)\(p_i\) 的正确位置,剩下的一个自然就确定了,因此可以挑选一个 \(p_i\) 不占用任何 \((x,c)\)。显然,剩下的饼中等于 \(p_i\) 的越多 \(p_i\) 就越难找到匹配,不妨直接 ban 掉某一个最多的。

可以用 Hall 定理证明,在上述前提下对于任意 \(n\ge 2\) 的情况总能构造出来一个匹配,使得每个 \(p_i\) 都能找到 \(n-1\)\(n-1\) 总不小于 \(\lceil \log_2 n\rceil\))个满足要求的 \((x,c)\)。用 Dinic 跑出来一组即可。

posted @ 2026-05-27 20:20  user_10086  阅读(6)  评论(0)    收藏  举报