2022.10.17 模拟赛小结

一场 ACM 模拟赛

题面PDF链接

(这个链接只是为了自己方便找,页面设置权限了,不要尝试访问)

更好的阅读体验戳此进入

(建议您从上方链接进入我的个人网站查看此 Blog,在 Luogu 中图片会被墙掉,部分 Markdown 也会失效)

赛时思路

T1

对于 n 个正整数的序列 an,给定 k,每次操作选择大于 kai,使 aiai1,然后会使 ai1ai1+1ai+1ai+1+1。求任意次操作后最大能选出多长的子串满足每个数都不小于 kT 组询问。

原题 LG-P3503 [POI2010]KLO-Blocks

赛时没想出来,最后糊了一个乱搞上去,然后乱搞也寄了,直接 0pts

一直在考虑维护把大于 k 的数推平然后补齐小于 k 的数,然后口糊证明了一下对于每一个大于 k 的数优先向右或向左一定不劣于左右各自推平一部分,不过这玩意依然是 O(2n) 的,然后设计了一个类似并查集的东西来维护向左向右的下一个未满足要求的数,然后常数也巨大。。

Code

T2

原题 AT5146 [AGC036C] GP 2

写了个 DP,假了,爆零,寄。

T3

原题 CF840E In a Trap

大概就是写了个暴力,然后数据比较奇怪,还多过了几个点。。最后本场唯一的 60pts

Code

T4

原题 LG-P8386 [PA 2021] Od deski do deski

不会,寄。

正解

T1

首先问题显然可以转化为,找一段最长的区间,满足区间的平均数大于等于 k。然后再转化为把每个数减去 k,然后要找最长的一段区间,满足区间加和大于 0。再转化为前缀和后就是要找最长的一段 sjsi0,显然 O(n2) 枚举会寄,考虑单调栈,对于左端点,显然若有 i<jsisj 那么 i 一定优于 j,或者说一定不会选择到 j,证明显然。于是单调栈维护左端点,单调递减,右端点单调递增,这样可以对于每个左端点二分右端点,反之亦然,复杂度 O(Qnlogn) 不正确。考虑维护左端点的单调栈后,对于右端点从 n1 枚举,若 si0 那么 [0,i] 一定合法,否则考虑如果当前点符合右端点单调栈的规则,那么开始和左端点的单调栈相匹配,然后左端点出栈,并更新答案,显然这里出栈的左端点一定在后面不会再用到了。

Code

T2

咕咕咕。

T3

咕咕咕。

T4

咕咕咕。

UPD

update-2022_10_17 初稿