第13届河南icpc省赛

河南省第十三届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. 输入输出

直接求区间和。

posted @ 2021-08-20 15:58  lemu  阅读(382)  评论(0编辑  收藏  举报
4