第13届河南icpc省赛
A. 祝融传火
签到题,直接暴力判断四个点是否相等。
B. Honeycomb
借一张别人的图
https://blog.csdn.net/qq_45323960/article/details/117429681
如图所示建立坐标系,根据蓝色圈内的序列二分得到\(y\),再经过最多6次旋转得到最终坐标。如果看不太懂这个坐标系可以将\(x\)和\(y\)轴来回平移就明白了。观察6种移动方式下\(x,y\)的改变\((0, 1)(1, 0)(-1, 0)(0, -1)(1, -1)(-1, 1)\)得到结论:\(令d1 = x1 - x2,d2 = y1 - y2\quad ans = d1 * d2 >= 0 ? |d1| + |d2| + 1 : max(|d1|,|d2|) + 1\)
C. Alice and Bob
首先尺取预处理出每一个位置的下一个合法位置,在对其求前缀和。对于每一个询问\([l,r]\),二分得到最末的合法位置\(x(x >= l - 1)\),则答案为\((x - l + 1) * (r + 1) - (pre[x] - pre[l - 1])\)
D. Connie
令\(dp[i][j]\)为生成到第\(i\)个字符时匹配到第\(j\)位的期望得分,枚举生成的字符\(c\),找到插入该字符后最大的匹配位置\(j'\)(这一步一般用kmp中的next数组优化)那么匹配成功时得分*2即 \(dp[i][j'] = dp[i - 1][j] * (j' == m ? 2 : 1)\quad ans = \sum_{i = 0} ^ m dp[n][i]\)
E. Dance with a stick
经典大风车,可以看看这个视频,视频前半段会给出一些提示,看看你能否从中找到答案。
做法
找到一个点和直线使得该直线两边点的数量相同,设直线(直线的方向就是箭头的方向)顺时针方向为白点,逆时针方向为黑点,在直线旋转过程中,如果我们碰到一个白点,原来的点会变为白点,碰到一个黑点,原来的点会变为黑点。因此直线两边点的数量始终不变,旋转180°后直线与初始直线平行,所以必然回到原点。
F. 图像识别
签到题,如果一个'*'水平方向与垂直方向上都有'*'那么它就是原点。
G. Elo mountains
建立Trie图,\(arr_i\)作为前缀出现的次数即为\(i\)的子节点个数\(+1\),不作为前缀出现的次数即为所有能沿着fail边跳到\(i\)节点的点及其子节点的个数和,dp即可。注意建图时要用可持久化数组优化。
H. 焦糖布丁
经典树上阶梯博弈,设根节点深度为0,仅当奇数层节点的异或和为0时后手必胜,那么只要看能否找到一个异或和为0的子集即可。
I. 七便士
可以直接爆搜,也可以分析结论。
J. 甜甜圈
贪心,每次找出最大的甜甜圈吃掉,需要用到数据结构。
K. 残局
打牌题,对抗搜索+记忆化,难点在于实现,代码有亿点长所以我还没写。
L. 手动计算
区域不大,精度也不高,均匀撒点即可,也可以各种积分。
M. 输入输出
直接求区间和。