题目链接:
大致题意
给定一个序列
a
a
a,你可以进行以下操作:
a
[
l
…
r
]
=
[
a
l
+
1
,
a
l
+
2
,
.
.
.
,
a
r
,
a
l
]
a[l…r]=[a_{l+1},a_{l+2},...,a_{r},a_{l}]
a[l…r]=[al+1,al+2,...,ar,al]
请问能否将序列
a
a
a 在经过若干次操作后得到序列
b
b
b
题解
观察到一次操作相当与把一个数字移动到与它相同的数字后面,并把他们之间的数字整体往前移动。可以理解成一个数字能往下标更大的地方移动。
使用双指针算法,
p
1
p1
p1 指向
a
a
a,
p
2
p2
p2 指向
b
b
b,从右往左扫,对于每一个
b
[
p
2
]
b[p2]
b[p2],找到与之相等的
a
[
p
1
]
a[p1]
a[p1],那些未能匹配的数必定是进行了一些操作往后移动了,使用
c
c
c 数组记录这些数字。。。。。待整理思路后补全
代码
#include <bits/stdc++.h>
using namespace std;
void slv() {
int n, mx = 0;
cin >> n;
vector<int> a(n + 1), b(n + 1), c(n + 1, 0);
for (int i = 1; i <= n; i ++)
cin >> a[i];
for (int i = 1; i <= n; i ++)
cin >> b[i];
for (int i = 1, j = 1; i <= n; i++) {
while (j <= n && b[i] != a[j])
c[a[j++]]++;
if (j > n) {
puts("NO");
return;
}
if (c[b[i]])
c[b[i]]--;
else
j++;
}
puts("YES");
}
signed main() {
int _;
cin >> _;
while(_--)
slv();
}