牛客紅包OI賽 B 小可愛序列

Description

連接:https://ac.nowcoder.com/acm/contest/224/B
來源:牛客網code

」我願意捨棄一切,以想念你,終此一輩子。「
」到後來,只能將記憶拼湊。「 ——QAQ
小可愛剛剛把KR的序列切開了,可是她尚未玩夠,因而就又雙叒叕打亂了佳佳剛剛買回來的序列。
可是還好,佳佳經過監控記錄下來了小可愛的打亂方式,因而把小可愛送回家以後,如今佳佳要還原這個序列。
佳佳須要維護一個長度爲n的序列,小可愛只用瞭如下兩種操做:
a.將最後一個數挪到第一位
b.將序列第3位挪到第一位
你須要給出最後的序列ip

Solution

某人跟我說是鏈表
而後就沒讀題無腦作
而後TLE以後發現不能無腦作get

而後有腦一下string

Code

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Node {
    int v; Node *nxt, *pre;
    Node(int _v, Node *_n = nullptr, Node *_p = nullptr) :
        v(_v), nxt(_n), pre(_p) { }
} *head, *tail;

void Delete(const Node* b, const Node* e = nullptr) {
    if (not e) e = b;
    b->pre->nxt = e->nxt;
    e->nxt->pre = b->pre;
}
void InsertNxt(Node* p, Node* b, Node* e = nullptr) {
    if (not e) e = b;
    Node* Pre = p;
    Node* Nxt = p->nxt;
    Pre->nxt = b;
    Nxt->pre = e;
    b->pre = Pre;
    e->nxt = Nxt;
}
void InsertPre(Node* p, Node* b, Node* e = nullptr) {
    if (not e) e = b;
    Node* Pre = p->pre;
    Node* Nxt = p;
    Pre->nxt = b;
    Nxt->pre = e;
    b->pre = Pre;
    e->nxt = Nxt;
}

void Sol1(int n) {
    Node* Beg = tail, *End = tail->pre;
    while (n--) { Beg = Beg->pre; }
    Delete(Beg, End);
    InsertNxt(head, Beg, End);
}
void sol2() {
    Node *now = head->nxt->nxt->nxt;
    Delete(now);
    InsertNxt(head, now);
}
void Show() {
    Node* now = head->nxt;
    while (now != tail) {
        printf("%d ", now->v);
        now = now->nxt;
    }
    puts("");
}

int main () {
    int n, m;
    scanf("%d%d", &n, &m);
    int u;
    tail = new Node(0); head = new Node(0);
    tail->pre = head, head->nxt = tail;
    for (int i = 1; i <= n; i += 1) {
        scanf("%d", &u);
        InsertPre(tail, new Node(u));
    }
    for (int i = 1; i <= m; i += 1) {
        char ch; int u;
        scanf("%d%c", &u, &ch);
        if (ch == 'a') {
            u %= n;
            if (u) Sol1(u);
        }
        else {
            u %= 3;
            while(u--) sol2();
        }
    }
    Show();
    return 0;
}
相關文章
相關標籤/搜索