Educational Codeforces Round 132 (Rated for Div. 2)

发布时间 2023-04-20 00:03:07作者: 努力的德华

题目链接

C

核心思路

这个题目有点经典,对于括号需要肯定第一个想法是想到栈。然后看有多少可以匹配。这里我们也照样采用栈的一个思考方式。

也就是使用\(s1\)来记录左括号减去右括号的数量,其实也就是已经匹配了的括号的数量。然后\(s2\)表示的是还不可以确定的问号的数量。

但是有一个边界:那就是)这样是不可合法的,所以当\(s1\)是0,肯定需要把当前的问号替换成(.也就是如果当前是问号并且\(s1\)是0,那么就把当前的问号直接替换成(就好了。

然后就是s1小于0时,问号就需要搞几个左括号上去了。

还有就是s1=0并且问号是奇数个,那么问号自己肯定不可以组成合法的序列。所以就需要s1--,s2++.

好了,这里可能会有疑问:为什么不讨论s1大于0的情况呢,其实这个放在答案讨论就好了。因为如果\(s2>s1\).就说明肯定问号除了匹配左括号,还可以自己组成的序列。所以肯定就不止一种方案了。

D

这个题目其实比较简单,我们可以这么想。我们发现这些障碍物其实只对x轴起作用。比如我们要从2列到5列,那么我们x至少移动到2列到5列的最大障碍长度+1的位置。然后再往左边移动到fx,再就是向上做就好了。

至于查询某个区间的最大长度就是用线段树就好了。建议画一个图就懂了,这其实就是以横坐标作为对应x,纵坐标作为对应的值的一个数组。然后建立线段树就好了。

然后有个trick就是:如果我们每次都只可以走k的倍数步。那么我再长度为d的限制下,可以到达的位置就是\(\lfloor{\frac{d}{k}}\rfloor *k\).这个d肯定就是\((n-sx)\).然后判断下和最大障碍的距离就好了。

这里需要注意的是这里的横纵坐标有点子诡异,这里是竖着的是x轴,横着的是y轴。