noip模拟赛

T1 elim

给你一个消消乐游戏的界面,$3$ 个及以上的同色连块会消除,求一次消除之后是什么样的

sol:模拟

 

T2 battleground

给你一个 $n \times n$ 的棋盘,上面有 $m$ 个玩家,玩家可以向 $8$ 个方向走,有的地方有障碍不能走,不能斜着从两个障碍里面挤过去(大概就是右边有障碍 + 下面有障碍 = 你不能走到右下)。有 $f$ 个回合,每回合会给你一个毒圈,毒圈里面的障碍会无效,所有玩家都会向毒圈里的一个目标(每个人可能目标不一样)走,在毒圈外面走一步会 $-1s$ ,给出每个人初始的生命,求这 $m$个人跑毒结束后还有多少生命 (生命值最低为 $0$ ,去世的玩家生命值视为 $0$ )

sol:

因为毒圈里不掉血也没有障碍,所以只要找出每个人走到毒圈里要走多远就可以了

不妨设他们都要走到毒圈的圆心,于是我们可以从圆心开始 $bfs$ ,圈里走一步代价为 $0$ 

圈外走一步代价为 $1$ 算出走到每个点的代价就可以算出每个人每轮扣的血了

 

T3 greedy

给你一个求图的独立集的算法,让你模拟

算法如下:

1.规约

step1.删掉所有度为 0 的点加入独立集

step2.删掉所有度为 1 的点和它相邻的点,并把那个编号小的那个加入独立集

 

如果当前不能规约,我们执行下面的

2.贪心

step1.找出度最大的点,如果唯一,删掉它

step2.如果不唯一,找到一个删掉后能使剩下的度数为 1 的点数最多的点,如果还有多个,删掉编号最大的点

$n \leq 10^5$

$m \leq 5 \times 10^5$

 

sol:暴力

维护一个 set / 可删除堆

堆内维护一个三元组表示 (度,跟它相连且度为 2 的点的个数,编号)

操作 1 直接做,操作 2 也是直接做

每个点只有在当做堆顶和度为 1 的时候会执行两次“把周围一圈的点的度 -1 ”

所以复杂度是对的

posted @ 2018-10-27 14:04  探险家Mr.H  阅读(138)  评论(0编辑  收藏  举报