CSP-J2021

游记

咕咕咕

T1

思路

显然当l与r整除n相同时,选择r个可以拿到最多的奖励,否则一定可以拿到n-1个奖励。

AC代码

T2

思路

复习第一轮的时候特地背过,插入排序是具有稳定性的,也就是如果两个元素值相等,排序后先后顺序不会对换。

我们可以用一个结构体存下每一个元素的值 \(v\) 以及它的初始位置 \(id\) ,最开始排一次序,然后用 \(ans[i]\) 记录排序前第i个元素在排序之后的id,也就是答案。那么对于查询操作,我们只需要 \(\theta (1)\) 输出 \(ans[i]\) 就行了。

然后来看修改操作。由于修改操作不超过5000次,所以必须在 \(O(n)\) 的时间内完成修改。修改操作给出的 \(i\) 对应了我们排序之后的 \(ans[i]\) ,在把这个元素的 \(v\) 修改之后,可以利用插排的思想,如果改小了就往前交换,否则往后交换,维护数组的单调性。最后再用 \(\theta (n)\) 的时间更新 \(ans\) 数组,完成修改。

讲的不是很清楚,看代码吧:

AC代码

T3

思路

看到题就知道是大模拟,显然无论是 Server 还是 Client ,就算 \(\theta (n)\) 暴力也可以过。难点只在 \(check()\) 上面。判断域名是否合法的代码没啥技术含量,但还是挺烦的。

开玩笑!STL大法帮我们节省了大量的代码长度。

  • string 切片操作(str的l到r): string(str.begin() + l, str.begin() + r + 1)
  • string 的比较操作(两个 string 要长度一样): str <= "255"

这样就很良心了。我们先扫一遍,记下三个 . 和一个 : 的位置,判一下个数以及先后顺序,然后把5个数字切片出来,一个一个判不存在、前导0以及>255,就写完了。

AC代码

T4

思路

看到题面感觉只能用模拟来做,所以考场上就打了一个 \(O(n^2)\) 的STL链表模拟。为什么想不到正解呢?考试的时候一直想不到合并操作怎么做,本来想的是用一个结构体存下来开始序号和结束序号,但是死活想不到怎么把已经被拿掉的水果筛掉,后来才知道拿一个 \(bool\) 数组筛掉就好了。。。

真tm是个蒟蒻。

时间复杂度 \(O(n \log n)\) ,因为每一段水果最多被合并 \(\log n\) 次。

感觉拿链表有 \(O(n)\) 的做法啊,但是我的指针老是写挂

AC代码