Gravatar
yrtiop
积分:2101
提交:309 / 808

Pro3783  [CSP 2022S]星战

zyf 的题解,写得比我好 QAQ

不难发现,答案为 YES,当且仅当所有点的出度均为 1。

考虑如何维护每个点的出度。

暴力的做法是对于每个点维护两个 set,分别表示当前与之相连/不相连的点,暴力删点加点。如果没有 $t=4$,不难发现总操作次数是 $\mathcal O(n+q)$ 级别的,可以获得 60 pts。

(据说这道题可以通过玄学暴力优化在民间数据拿到满分,毕竟这题的数据并不好造,很难有极限数据)

(然而我考场上尝试玄学暴力乱搞,结果全输出 NO,爆零了 QAQ)

upd:现在还没有出数据,但据说全输出 NO 能有 45 pts?乱搞选手赢麻了。

再次 upd:出数据了,我这种乱搞法居然 50pts,赢麻了,但是 rp-- 了 QAQ。

计算了一下,前 60 pts 暴力,后面全输出 NO,能有 80 pts,已经不比正解低多少了。

这道题的核心就是维护出度为 1 的点数,而有了 $t=4$ 的操作会变得非常棘手,没有任何数据结构可以维护。

一般来说(至少以窝之前打的一场 CF 看来),这种情况可以转向随机化。

考虑哈希。对每个点赋一个独一无二的权值(我采用了类似字符串哈希的构造方式),设第 $i$ 个点点权为 $a_i$,定义 $tot=\sum\limits_{i=1}^n a_i,ans=\sum\limits_{i=1}^n deg_i\times a_i$。

其中 $deg_i$ 表示点 $i$ 的出度。

由于点权都是独一无二的,若 $ans=tot$,那么就有极大的概率满足 $\forall i\in [1,n],deg_i=1$。

$tot$ 可以直接计算,而 $ans$ 的维护也相当简单,单次操作时间复杂度 $\mathcal O(1)$。

总时间复杂度为 $\mathcal O(n)$,目前在 InfOJ 上的民间数据这种方法可以拿到满分。

如果还不保险,还可以多取几个模数或点权。

upd:似乎不用我这样写,把求和改成异或,直接随机权值就完全能过了 /kel


2022-11-08 10:56:11    
我有话要说
暂无人分享评论!