蓝桥杯A组 双向排序

在这里插入图片描述

总结了 AcWing 上y总的题解AcWing 3419. 双向排序(蓝桥杯C++ AB组辅导课)
这道题如果使用排序模拟可以得60分,要想得到正解需要找到其中的一些性质。

我们观察连续两个操作可能的情况,首先如(1)(2)所示,连续两个操作都是前缀操作的的情况,那么这时不管是先进行较长的操作,还是较短的操作,最后的结果都是执行一次较长操作后的结果,所以较短的操作可以省去。形如(3)(4)的后缀操作也是同理。这样的话我们就可以将题目简化为一个前缀操作,一个后缀操作交替进行的状态。
在这里插入图片描述
现在我们进一步寻找规律,我们看相邻两个前缀操作,首先我们要知道,一开始就执行后缀后缀操作是没有任何意义的,因为数组一开始就是递增排序的。所以就从一开始的操作为前缀操作开始研究。(5)所示是第二次前缀操作比第一次短的情况,黑色实线部分为涉及到的操作段,虚线部分是本次操作没有涉及到变换的段。而红色段是相对于上次变化的段(反转)。
在这里插入图片描述

对比第一次前缀与第一次后缀可以发现,第一次后后缀操作的变换只涉及到与前一次变换有交集的部分,因为上一次的后面已经是最大的一部分了。而第二次的前缀操作也只会变换和第一次后缀操作的交集部分。因为两边是对称的,所以也可以用同样的方法证明两个相邻的后缀操作的情况。

下面再看第二次前缀比第一次前缀要长的情况。这里用不同的颜色标注了各个部分的去向。我们发现这里做的只是将比第一次后缀操作多的那个部分放到了最前面,其余的部分只是将其重新回归了顺序,所以其实这就相当于是没有做第一次后缀和第一次前缀操作,也就可以将他们两次删除了。同样相邻的两次后缀操作也可以用同样方法来证明。
在这里插入图片描述
既然相邻两次前缀或后缀操作一次一定会比另一次小,那么我们可以得出结论,每一次相对与上次变换的那一个字段(也就是上图红色段)一定是会从两端向内紧缩并变短的。而每一次缩完之后的红色段之外的段的数值就永远不会改变了。我们就可以通过这个性质结合简化后的操作序列直接构造出答案了。
代码如下:

#include<iostream>
#include<string.h>
#include<map>
#include<set>
#include<string>
#include<algorithm>
#include<vector>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值