トピックへのリンク:http://cogs.pro:8081/cogs/problem/problem.php?pid=vimiQkqjU
説明[タイトル]
サンプル入力:
4
2 3 1 4
3 2 1 4
サンプル2 - 入力:
4
1 2 3 4
1 7 2 4
アイデア:[シグマ(≦iがn≦)(AI - BI)マッチボックス、最小距離のために2は わずか約AI * BIを導入してもよく、値の値よりも大きいかまたはスクランブル等しい配列を発見し、したがってのみに必要これを行うためにBは、アイデアは、同じ相対的な順序の別のは、コードになるように最初の昇順または降順を考慮するが、好ましくは固定スイッチング周波数で最小を要求することである[I] B iは、i番目の要素を表すだけ逆に統計的である必要は、位置を表します。
コードは以下の通りであります:
1 #include "iostream" 2 #include "cstdio" 3 #include "algorithm" 4 #define maxn 100100 5 #define ll long long 6 using namespace std; 7 8 struct stick 9 { 10 int length, id; 11 bool operator < (const stick& a)const 12 { 13 return length < a.length; 14 } 15 }s[maxn], d[maxn]; 16 17 ll temp[maxn], n, a[maxn]; 18 ll sum = 0; 19 20 void merge(ll b[], ll l, ll r) 21 { 22 for (int i = l; i <= r; i++) 23 { 24 temp[i] = b[i]; 25 } 26 int mid = (l + r) >> 1; 27 int i = l, j = mid + 1; 28 for (int pos = l; pos <= r; pos++) 29 { 30 if (i == mid + 1) 31 { 32 a[pos] = temp[j]; 33 j++; 34 } 35 else if (j == r + 1) 36 { 37 a[pos] = temp[i]; 38 i++; 39 } 40 else if (temp[i] > temp[j]) 41 { 42 a[pos] = temp[j]; 43 j++; 44 sum += mid - i + 1; 45 sum %= 99999997; 46 } 47 else 48 { 49 a[pos] = temp[i]; 50 i++; 51 } 52 } 53 } 54 55 void msort(ll b[], ll l, ll r) 56 { 57 if (l == r) 58 return; 59 int mid = (l + r) >> 1; 60 msort(b, l, mid); 61 msort(b, mid + 1, r); 62 merge(b, l, r); 63 } 64 65 int main() 66 { 67 freopen("MatchNOIP2013.in", "r", stdin); 68 freopen("MatchNOIP2013.out", "w", stdout); 69 cin >> n; 70 for (int i = 0; i < n; i++) 71 { 72 cin >> s[i].length; 73 s[i].id = i; 74 } 75 for (int i = 0; i < n; i++) 76 { 77 cin >> d[i].length; 78 d[i].id = i; 79 } 80 sort(s, s + n); 81 sort(d, d + n);//排序后方便将id离散化 82 for (int i = 0; i < n; i++) 83 { 84 a[s[i].id] = d[i].id; 85 } 86 msort(a, 0, n - 1); 87 cout << sum % 99999997 << endl; 88 return 0; 89 }