题意
给出一个排列,每次操作可以交换相邻的两个值。使用若干次该操作使得数组有序。
问操作是否唯一。
题解
操作唯一当且仅当最长上升子序列长度>=n - 1。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a[100010]; 5 6 int main() 7 { 8 int T; 9 for (scanf("%d", &T); T; T--) 10 { 11 int n; 12 scanf("%d", &n); 13 for (int i = 0; i < n; ++i) 14 scanf("%d", &a[i]); 15 vector<int > v; 16 v.push_back(a[0]); 17 for (int i = 1; i < n; ++i) 18 if (a[i] > v[v.size() - 1]) 19 v.push_back(a[i]); 20 else 21 { 22 int l(0), r(v.size() - 1); 23 while (l < r) 24 { 25 int mid = (l + r) / 2; 26 if (a[i] > v[mid]) 27 l = mid + 1; 28 else 29 r = mid; 30 } 31 v[l] = a[i]; 32 } 33 if (v.size() >= n - 1) 34 puts("Y"); 35 else 36 puts("N"); 37 } 38 39 return 0; 40 }