牛客红包OI赛 B 小可爱序列

Description

链接:https://ac.nowcoder.com/acm/contest/224/B
来源:牛客网

”我愿意舍弃一切,以想念你,终此一生。“
”到后来,只能将记忆拼凑。“ ——QAQ
小可爱刚刚把KR的序列切开了,但是她还没有玩够,于是就又双叒叕打乱了佳佳刚刚买回来的序列。
但是还好,佳佳通过监控记录下来了小可爱的打乱方式,于是把小可爱送回家之后,现在佳佳要还原这个序列。
佳佳需要维护一个长度为n的序列,小可爱只用了以下两种操作:
a.将最后一个数挪到第一位
b.将序列第3位挪到第一位
你需要给出最后的序列

Solution

某人跟我说是链表
然后就没读题无脑做
然后TLE之后发现不能无脑做

然后有脑一下

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;
}
posted @ 2018-11-01 21:24  Grary  阅读(122)  评论(0编辑  收藏  举报
博客园 首页 私信博主 编辑 关注 管理 新世界