写在开头的话
学习了今天的知识,让我们来做一道题目练练手吧。(题目是别的地方扒来的,参考答案是我自己写的,肯定不是最优解,有更好的方法欢迎评论区交流)
第一题------左移右移


参考答案
第一题参考答案(Python版)
python
import sys
def solve():
input = sys.stdin.read
data = input().split()
idx = 0
N = int(data[idx]); idx += 1
M = int(data[idx]); idx += 1
# 使用双向链表,用数组模拟
# left[i] 表示数字i左边的数字
# right[i] 表示数字i右边的数字
# 使用0作为左哨兵,N+1作为右哨兵
left = [0] * (N + 2)
right = [0] * (N + 2)
# 初始化:1, 2, 3, ..., N
for i in range(1, N + 1):
left[i] = i - 1
right[i] = i + 1
# 设置哨兵
left[0] = 0
right[0] = 1
left[N + 1] = N
right[N + 1] = N + 1
for _ in range(M):
op = data[idx]; idx += 1
x = int(data[idx]); idx += 1
# 如果x已经在正确的位置,跳过(可选优化)
if (op == 'L' and left[x] == 0) or (op == 'R' and right[x] == N + 1):
continue
# 将x从链表中移除
l = left[x]
r = right[x]
right[l] = r
left[r] = l
if op == 'L':
# 移动到最左边
# 当前第一个元素是right[0]
first = right[0]
# 将x插入到0和first之间
right[0] = x
left[x] = 0
right[x] = first
left[first] = x
else: # 'R'
# 移动到最右边
# 当前最后一个元素是left[N+1]
last = left[N + 1]
# 将x插入到last和N+1之间
left[N + 1] = x
right[x] = N + 1
left[x] = last
right[last] = x
# 输出结果
result = []
curr = right[0]
while curr != N + 1:
result.append(curr)
curr = right[curr]
print(' '.join(map(str, result)))
if __name__ == "__main__":
solve()