又是一瓶奶,一道题,一写就是一小时。。。。思路蛮快的,链表删除反倒是出错看了半天我去。
我的思路:
我们不能一个一个机械地按照指令对数组进行排序操作。我们需要对操作序列预先处理,减少复杂度。由于处理过程需要进行增、删、遍历操作,我选择了链表作为数据结构。【不知道有没有更好的数据结构?】
首先说明一个命题:
操作为0是从前面降序,操作为1是从后面升序。假设操作0 m和1 n两次,则这俩操作区域在数组的示意图如下,阴影表示操作区域,要么:
|/m____n\\\\\\\\\\|
要么:
|nXXXm\\\\\\\|
第二种即有所交叉。
由于mn一个升序,一个降序,所以不管是先做m操作还是先做n操作,交叉的n___m段序列都一样。
以此为基础。
建立一个存储操作序列的链表。
typedef struct Link{
Link* next;
int p;
int q;
}Link;
typedef Link* List;
考虑操作数为0,操作下标假设为x。如果在已知的操作序列中,存在操作数为0、操作下标为y(y<x),我们认为0 x操作覆盖了0 y操作,将0 y从操作序列中删除。
此处覆盖指的是操作范围覆盖:
|XXXXXXy\\\\\\\\x________|
<