题意是给一个数列,可以对三个数操作:把最后一个数放到第一个,前两个数后移一位。问最后能否到达相应的目标序列。
比如 1 2 3 会转换为3 1 2,多了两个逆序对。
给出两列数a和b,问a是否能变成b,则求a对于b的逆序对,若为偶数,则可以变成b,若为奇数,则不能。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define lowbit(x) (x&(-x))
#define MOD 99999997
using namespace std;
const int N = 100010;
int a[N], n, c[N], b[N], tree[N];
ll ans;
int sum(int x) {
int ret = 0;
while(x > 0) {
ret += tree[x];
x -= lowbit(x);
}
return ret;
}
void add(int x, int d) {
while(x <= n) {
tree[x] += d;
x += lowbit(x);
}
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++)
cin >> c[i];
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n; i++)
b[a[i]] = i;
for(int i = 1; i <= n; i++)
c[i] = b[c[i]];
for(int i = n; i > 0; i--)
add(c[i], 1), ans += sum(c[i] - 1);
ans % 2 ? cout << "Impossible" : cout << "Possible";
return 0;
}