Educational Codeforces Round 48 (Rated for Div. 2)

总结

这场由于过于着急B题意读错卡B卡了将近40分钟,导致C写完由于数组开小了没时间改好,同时也导致一个赛后十分钟秒了的D根本没时间看。读题很重要啊!!!


A题 Death Note

水题直接上代码
https://paste.ubuntu.com/p/mt846nYfqh/


B题 Segment Occurrences

就是预处理+前缀和,注意查询时范围的处理就好了
https://paste.ubuntu.com/p/QbNssfQvrD/


C题 Vasya And The Mushrooms

题意
给你一个2*n的网格,每一个点有权值,而且每一个点每秒权值有一个增长速度,每个格子只能走一次,求怎样走权值和最大。
做法
我们可以发现,只要我们向右连续走两步,就必须一直向右走撞到墙再拐回来才算最优,所以我们可以预处理每个点作为向右转的点时前缀和后缀和,然后取max就可以了。由于有可能从第一排向右或者从第二排向右,所以这些都要预处理好。代码量略微有些爆炸,把要走的路径拼成一个新数组代码量会少一些。算是个模拟题了。
代码
https://paste.ubuntu.com/p/4QmRYbtmgY/


D题 Vasya And The Matrix

题意
给你一个长度为n的数组a,一个长度为m的数组b,要求构造一个n*m的矩阵
使每一行的异或和恰好对应数组a,每一列的异或和恰好对应数组b
构造不出输出-1
做法
很显然我们可以将n*m填满0,再将第一排和最左排按a,b数组填充,这样就只有左上角的元素有问题,对于最后一个元素,我们可以看下面这个图
这里写图片描述
我们可以推出两个式子:
x^b2^b3^b4^ b5^…^bn-1^bn=a1
x^a2^a3^a4^a5^…^an-1^an=b1
我们将两式左右分别异或合并得到
b2^b3^..bn^a2^a3^…an=a1^b1
再将两边同时异或a1^b1得到
a1^a2^…an^b1^b2^..bn=0
所以这个就是可以构造出合法矩阵的条件
那么x到底怎么填呢,我们继续推导
x^b2^b3^…bn=a1
左右同时异或x^a1
a1^b2^b3^….bn=x
这样我们就得到了x本题就结束了
代码
https://paste.ubuntu.com/p/GjdQvtsKVd/


E题 Rest In The Shades

题意
给你一个沿着x轴方向移动的光源初始位置和移动的范围,然后给你一些在x轴上的不相交的线段。
每次查询给你一个x轴上方的点,问光源移动期间这个点被线段遮挡的时间。

做法
对于每次查询点,我们可以观察下面这张图。
这里写图片描述

我们可以分别连接点p与光源的起点和终点,这样就能得到x1,x2两个交点,我们只要知道x1,x2之间线段的长度,通过相似三角形也就知道这段在sa->sb上的长度,所以我们得到x1,x2后,二分一下判断x1,x2分别在哪个线段的左侧,或者哪个线段上,然后通过预处理的前缀和将这两个线段之间完整的线段长度加到答案里,对于不完整的特判一下x1,x2相对于线段的位置就可以了。

代码
https://paste.ubuntu.com/p/zVrP9gKTwc/

猜你喜欢

转载自blog.csdn.net/qq_38891827/article/details/81880508