题目:
Patrick likes to play baseball, but sometimes he will spend so many hours hitting home runs that his mind starts to get foggy! Patrick is sure that his scores across n sessions follow the identity permutation (ie. in the first game he scores 1 point, in the second game he scores 2 points and so on). However, when he checks back to his record, he sees that all the numbers are mixed up!
Define a special exchange as the following: choose any subarray of the scores and permute elements such that no element of subarray gets to the same position as it was before the exchange. For example, performing a special exchange on [1,2,3] can yield [3,1,2] but it cannot yield [3,2,1] since the 2 is in the same position.
Given a permutation of n integers, please help Patrick find the minimum number of special exchanges needed to make the permutation sorted! It can be proved that under given constraints this number doesn't exceed 10^18.
An array aa is a subarray of an array bb if a can be obtained from b by deletion of several (possibly, zero or all) elements from the beginning and several (possibly, zero or all) elements from the end.
思路:
①全部都是正确位置 0
②从前后跑到第一个不是a[i] = i,从后往前跑到第一个不是a[i] = i,判断中间的是不是都是a[i] != i,如果是就是1,不是就是2
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <queue> 5 #include <string> 6 #include <vector> 7 #include <cmath> 8 9 using namespace std; 10 11 #define ll long long 12 #define pb push_back 13 #define fi first 14 #define se second 15 16 const int N = 2e5 + 10; 17 int a[N]; 18 19 void solve() 20 { 21 int T; 22 cin >> T; 23 while(T--){ 24 int n; 25 cin >> n; 26 for(int i = 1; i <= n; ++i) cin >> a[i]; 27 int same = 0; 28 for(int i = 1; i <= n; ++i){ 29 if(a[i] == i) same++; 30 } 31 if(same == n) cout << 0 << endl; 32 else{ 33 int l, r; 34 for(int i = 1; i <= n; ++i){ 35 if(a[i] == i) continue; 36 l = i - 1; 37 break; 38 } 39 for(int i = n; i >= 1; --i){ 40 if(a[i] == i) continue; 41 r = i + 1; 42 break; 43 } 44 same = 0; 45 //cout << "l = " << l << " " << " r = " << r << endl; 46 for(int i = l + 1; i <= r - 1; ++i){ 47 if(a[i] == i) same++; 48 } 49 if(same == 0) cout << 1 << endl; 50 else cout << 2 << endl; 51 } 52 } 53 } 54 55 int main() 56 { 57 ios::sync_with_stdio(false); 58 cin.tie(0); 59 cout.tie(0); 60 solve(); 61 62 return 0; 63 }