[补题]SWERC-2018

SWERC-2018

A题是个暴力就能过的签到

过完A看到有个队伍过了D,就去看了下D题,给平面内若干个点,你要选一条直线\(y=p\)作为主干道,从\((0,y_0)\)出发,每次可以选择上/下/右地走,问最短距离。

一开始看到有绝对值先想了个取中位数的做法,然后发现如果一个\(x\)有好几个\(y\),直接算就会出问题:对于一个点\(x_0\),假设这里\(x\)的最大是\(mx\),最小是\(mi\),如果\(p<mi\),代价是\(2|mx-p|\),如果\(p>mx\),代价是\(2|p-mi|\),否则代价是\(2|mx-mi|\),三种情况的代价不一样,直接取中位数就出了问题,当时没细想,注意到这东西可以三分:如果\(p\)太大或者太小,都会导致答案很大。

实际上也可以证明这东西是单峰的:假设在\(p=p_0\)处取得最小值,扰动当前的,比如让\(p\)变大,那导致的结果将是对于\(p\geq mx\)的部分(记为\(Part1\)),代价\(2|p-mi|\)变大,对于\(p<mi\)的部分(记为\(Part2\)),代价变小,而如果\(p \in[mi,mx)\)之间的则不变。同理,对于\(p\)变小的情况,取等条件稍微改一下,Part1变小,Part2变大,于是整体代价变大变小只取决于Part1多还是Part2多。对于\(p=p_0\)的位置,Part1和Part2的个数的差值一定不超过1(不然就更优了),(而且如果可以,应该是\(|Part2|-|Part 1|=1\)\(|Part 1|-|Part 2|=1\)这两个位置都能取到最优)

这样一来,如果\(p\)变大,\(|Part 1|\)单调不减,\(|Part 2|\)单调不增,代价单调不减,对于\(p\)变小也类似地,所以整个代价和\(p\)的函数关系就是一个单峰的啦。

于是就写了个三分:https://paste.ubuntu.com/p/mYFZYd6FVb/

当然其实这官方给的做法还是中位数…你看都分析到这一步了,这不是和当初分析中位数的时候一样一样的,把\(mx、mi\)拎出来做中位数就行啦…

再往下是B题,一开始读完题想到了poj那个经典的单调栈的题,但想了想发现不知道怎么搞,就开始想暴力,\(N\leq 10^5\),多带个log好像也能过,那我就二分+线段树吧…枚举我们要找的最大子正方形从第\(i\)行开始,在第\(j\)行结束,这里对\(j\)二分,然后这样子边长就只取决于\(\min_i\{b_i\}-\max_i \{a_i\}+1\)是多少,这可以拿个线段树维护一下:https://paste.ubuntu.com/p/sZv2P2DKSp/

接下来E题一直给我卡到比赛结束都没过,不说了(

K题给个字符串,问最短能够压缩成多短(比如\(aabaabcdda\)能压成\((a^2 b)^2 c d^2a\),长度是5),赛后补掉的,好像一旦往区间dp去靠就有想法了,dp的一边用哈希之类的东西判一下,能整段压缩就直接压缩:https://paste.ubuntu.com/p/3WT9gskc3Q/

差不多了,该复习期中考了

posted @ 2021-05-04 16:52  yoshinow2001  阅读(129)  评论(0编辑  收藏  举报