CSP-S 2021 题解

我的 CSP-S 2021 游记

T1 廊桥分配(airport)

这次 T1 带有很大的迷惑性。

其实吧本身这个 T1 不难,以国内区为例子,我们设 s u s_{u} su 表示当分配给国内区 u u u 个廊桥的时候国内区有几架飞机能够停靠,不难发现如果规定 s u s_{u} su 表示有几架飞机刚好停在第 u u u 个廊桥,就可以直接单点修改然后做一遍前缀和。

由于飞机停靠遵循先来后到原则,因此实际上求出 s u s_{u} su 数组是可以用两个优先队列解决的,复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

对国内区和国际区分别做一次,得到 s 1 , s 2 s1,s2 s1,s2 两个数组之后,答案就是 max ⁡ i = 0 n ( s 1 i + s 2 n − i ) \max_{i=0}^{n}(s1_i+s2_{n-i}) maxi=0n(s1i+s2ni)

这个做法倒是挺简单的,就是一个贪心思路,但问题是考场上给的两个小样例很具有迷惑性,让人以为如果设 f ( x ) = s 1 x + s 2 n − x f(x)=s1_x+s2_{n-x} f(x)=s1x+s2nx,这个 f ( x ) f(x) f(x) 是满足单峰性的,然后很多人就写了个三分于是愉快的挂掉了()

实际上考场上的大样例输出来看一眼就知道 f ( x ) f(x) f(x) 并不满足单峰性,然后就知道三分是假的了。

当然那个大样例的图画出来大概是这样的:

在这里插入图片描述

也就是说实际上大样例面对部分三分是能过的,还是相对比较水,当然至少有些人的三分被卡了。

Update:貌似三分的时候 r − l > 50 r-l>50 rl>50 之后转暴力就能场切……

T2 括号序列(bracket)

先咕着。

T3 回文(palin)

这道题我考场上的时候敲了个 O ( 2 n ) O(2^n) O(2n)(不是 O ( 2 2 n ) O(2^{2n}) O(22n)) 的代码,然后成功搞到 40pts。

进入正题。

我们设 M a t c h i Match_i Matchi 表示互相相等的两个数,另外那个数的位置,也就是说如果 a i = a j a_i=a_j ai=aj,那么 M a t c h i = j , M a t c h j = i Match_i=j,Match_j=i Matchi=j,Matchj=i

然后我们就可以得到一个奇怪的性质:设每次取出 a i a_i ai 之后我们在 M a t c h i Match_i Matchi 位置上打个标记,那么除第一个数之外,每次取出的数 a j a_j aj M a t c h j Match_j Matchj 位置左右两边有且仅有一个位置是有标记的。

证明的话其实也比较简单:

在这里插入图片描述

我们发现箭头指的那个点左右两边都被打标记了,这个数所匹配的另一个数比左右两个数都要迟一点取出,由于取出的数列是个回文串,那么这个打箭头的数必须要先被取出,可是这样的话左右两边就有一个数要被取出了,这样就打破了回文串的性质。

至于说左右两边一个都没有为什么不可行(第一个数除外),也是可以类似证明的,因为有数字被你卡在里面了。

然后我们根据上述性质贪心的从左边选,找到解就输出,没了。

这个复杂度是 O ( T ∑ n ) O(T\sum n) O(Tn) 的,但是我不会证qwq

T4 交通规划(traffic)

先咕着。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值