loj3175. 「IOI2019」排列鞋子

发布时间 2023-09-07 09:48:29作者: FOX_konata

原题

做这题时一定不要被ioi吓到,因为这题非常非常降智

结论1:从左到右便利一遍,对于一个\(x\)和前面最左边第一个没被匹配的\(-x\)匹配,一定是最优的

证明显然,发现交叉和包含一定不优

于是我们对于每一个\(x\)可以得到与它匹配的鞋子\(b_x\)

但问题来了,我们是让\(x\)去找\(b_x\)还是\(b_x\)去找\(x\)呢?

结论2:所有鞋子同向移动一定最优

从左到右便利每一个位置,对于每个没有操作过的位置,如果将它的\(b_x\)给拉过来,那么\(x\)\(b_x\)就一定不会出现在别的鞋子对中间了,那么也就缩短了别的鞋子对之间的距离。但如果\(x\)屁颠屁颠的跑过去凑到\(b_x\)旁边,那么很可能就会使得别的鞋子对在移动的时候需要和他们两个进行交换了。

因此我们对于找\(b_x\)我们可以用指针找到前面第一个没被匹配的反向鞋子;而对于从左到右扫记录贡献时,我们记录一下哪些鞋子已经配对了;而对于统计答案时,就是看\((x,b_x)\)中没有被配对的鞋子个数。这样原问题就变成了一个单点修改,区间求和的问题,可以用树状数组解决

最终复杂度\(O(nlogn)\),瓶颈在于树状数组