A - Ah, It’s Yesterday Once More
构造一张二维地图,仅有墙壁和空白组成。在每个空白处都有一个人,每个人在接下来的 50000 步中将向一个方向随机移动。
要求构造的地图必须小于 20×20,至少有两个空白,每个空白之前必须是相互可达的,不能有环,50000步后所有的人25%的可能性不在同一个格子。
构造
很奇怪的一道题,练习的时候莫名其妙的就 A 了。
由于题目并没有输入数据,所有的人的行动数据都是随机的。很明显按照题目的意思,答案可以是固定的,没必要在程序中生成。而且路线长什么样子没什么关系(因为人的行动完全随机)。
只要保证人尽可能的多,路线尽可能的长就行。
然后在 cf 上交了个 PHP 莫名其妙的就 A 了。
D - Drgree of Spanning Tree
给一个无向联通图,有n个定点m条边。找到一颗生成树,使得这个生成树的每个顶点的度数不大于2n
注意可能有自环或者重边
图论
并查集
思维
生成树
训练的时候没做出来 现在某种意义上我是抄的这个题解Degree of Spanning Tree
CF上有一道相似的题目(还更麻烦点)Codeforces 1133F2
假如我们现在有这样一张图和它的一个生成树
我们想要降低顶点 1 的度
太难看了,我们重新整理一下
之后我们将1作为根,使用并查集标记它的所有子树
依次遍历原图中所有的边,如果这个边不是和根直接相连的,而且又连接了两个不同的子树,那么我们可以试图将这条边加入生成树中,并移除根与其中一个字树的联系。
这里我们选择(2,4)边
显然,新连接的边的定点不符合题意。我们可以反过来试一下(这里没有这个必要,但是部分情况可能会用到这个操作)
我们连接(2,4)时,不再断开(1,2),而是断开(1,4)
连接(2,4)边的两种方式都不符合要求,现在应该恢复到未连接2−4前的状态,继续尝试选择其他边
接下来尝试(3,4)也不行,直到我们选择(2,3)
通过这种操作,我们将1的度数降低了1
类似的,这道题我们也可以采用这种方式。树我们可以随便生成一个,而其中度数大于2n的定点只会有一个。
我们只需要将这个顶点作为根,重复上面的操作即可。
E - Evil Coordinate
机器人从(0,0) 出发,地图上在 (mx,my) 位置有地雷。问机器人完成所有指定指令后,是否不会踩到地雷。
所有的指令顺序可以打乱。
思维
模拟
还是挺无脑的暴力的。
一共就 UDLR 四种移动方式,先完成其中的一种,再完成另一种,如果触碰地雷就将完成循序调换一下,很容易得出结果。
F - Fireworks
Kotori n 分钟能制作一个烟花,每个烟花只有 p×10−4的可能性成功。当她制作完一个烟花后可以选择再做一个,或者消耗m分钟将之前制作的烟花燃放。
如果燃放的烟花中有一个成功, Kotori 就会停止燃放,否则她就会继续燃放。求最优策略下塔停止燃放眼花的最小期望时间,
三分
概率
设 Kotori 燃放 k 次烟花,那么至少一次燃放成功的概率为 1−(1−p)k,其期望为 E(k)=1−(1−p)k1
那么用时期望为 (k×n+m)×E(k)=1−(1−p)knk+m
之后盲猜这是一个凹函数,用三分法求解:
H - Harmonious Rectangle
定义一个和谐矩阵为存在以下任意一种染色的矩阵 1≤x1<x2≤n,1≤y1
⎩⎨⎧color(x1,y1)=color(x1,y2)color(x2,y1)=color(x2,y2)或⎩⎨⎧color(x1,y1)=color(x2,y1)color(x1,y2)=color(x2,y2)
输入一个 n和m,表示矩阵的长和宽。在上面用红,蓝,黄涂色。输出有多少种染色方式存在和谐矩阵。
结果对 109+7 取模
鸽笼原理
打表
首先当 n=1 或者 m=1 时,根据样例,肯定无解。
当n=2,m=1时,共有9种组合,也就是说当m>9时一定存在和谐矩阵。
进一步推广,也就是当max(n,m)>9时一定存在和谐矩阵。我们只需要对max(n,m)≤9的情况打表即可
然而刚开始没想范围写了个暴力,结果太慢了
正好拿来对拍
修改之后成了这样子:
AC 代码:
K - K Co-prime Permutation
k co-prime 排列是指排列中有 k 个数字 ai 和 i 互质。
输入序列长度 n 和 k, 构造这样的排列
思维
签到
一个数和他相邻的数互质,我们只需要将k个数错开一位就行。
直接调库
L - Let’s Play Curling
红队 n 个冰壶、蓝队 m 个冰壶,给出所有冰壶的坐标,找到一个位置 c 使得红队能赢且得分尽可能多,若红队能赢输出最多能得到的分数,若红队不能赢输出 Impossible。
思维
红队得分的条件是红队的冰壶离中心点c比蓝队近,所以这个题可以转化成任意相邻的两个烂队冰壶之间最多有几个红队的冰壶。
M - Monster Hunter
在一个根节点为 1 的有n个定点的有根树,每个顶点都有一个怪物,第i个顶点上的怪物有hpi滴血。现在要按照下列规则杀死所有怪物
- 当一个顶点的直接父节点上的怪物被杀死时,这个节点上的怪物才能被杀死
- 杀死第 i 个节点上的怪物需要消耗的能量为第i个节点上的怪物hpi和这个节点的所有直接子节点上的存活的怪物的hp总和,即消耗的能量为
hpi+顶点j上的怪物是存活状态且i的直接子节点是j∑hpj
- 使用魔咒消耗0能量,且无视上述限制,杀死选择的怪物。
当符卡数量 m=0,1,2,…,n 时,输出杀死所有怪物所需消耗的最小能量
树形背包
很喜欢yrh说过的一句话,“不会dp”
一开始想着倒着进行贪心,贪着贪着就挂了。
正解是 dp,某种意义上还挺好理解。dp[i][j][k],其中i表示当前节点的编号,j表示使用的魔咒的数量,k表示是否选择当前节点。
转移方程为
⎩⎨⎧dp[i][j][0]=dp[i][j−k][0]+min(dp[son][k][0],dp[i][j−k][1])dp[i][j][1]=dp[i][j−k][1]+min(dp[son][k][0],dp[son][k][1]+hp[son])
对于第二维,我们可以使用滚动数组消掉实测不消也能过