1. 程式人生 > 遊戲 >《審判之逝》DLC《海藤正治事件簿》今日發售 官方釋出宣傳片

《審判之逝》DLC《海藤正治事件簿》今日發售 官方釋出宣傳片

傳送門

轉化距離定義可知目標是求 Σ(ai*bi) 的最大值,這要求 a 列和 b 列以大小比較為相對順序的序列完全相等。那麼首先要得到兩列的以大小比較為相對順序的序列,一提到相對順序就需要聯想到離散化。離散化後,由於兩個序列都是一個n的全排列,可以先把 ai 對映作 i ,a列轉化為1到n的順序排列,並對 b列也作相同對映。將b列轉化為a列的最小步驟的實質是求解對映後的 b列中的逆序對(每一次交換,最多可以讓序列中的逆序對減一,當序列中沒有逆序對時,則b=a,那麼最小運算元則為逆序對個數)。用歸併排序求解b列的逆序對個數。

#include<iostream>
#include
<algorithm> #include<map> #define mod 99999997 #define maxn 100007 using namespace std; int a[maxn], b[maxn], n, ans, t[maxn], lsa[maxn], lsb[maxn]; map<int, int>Map; void merge_sort(int arr[], int l, int r) { if (l == r) return; int mid = (l + r) >> 1; merge_sort(arr, l, mid), merge_sort(arr, mid
+ 1, r); for (int i = l, j = l, k = mid + 1; i <= r; i++) { if (j == mid + 1) t[i] = arr[k++]; else if (k == r + 1) { t[i] = arr[j++]; ans += k - mid - 1; ans %= mod; } else if (arr[j] < arr[k]) { t[i] = arr[j++]; ans
+= k - mid - 1; ans %= mod; } else t[i] = arr[k++]; } for (int i = l; i <= r; i++) arr[i] = t[i]; } int main(void) { ios::sync_with_stdio(false); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i], lsa[i] = a[i]; for (int j = 1; j <= n; j++) cin >> b[j], lsb[j] = b[j]; sort(lsa + 1, lsa + n + 1); sort(lsb + 1, lsb + n + 1); for (int i = 1; i <= n; i++) { a[i] = lower_bound(lsa + 1, lsa + n + 1, a[i]) - lsa; b[i] = lower_bound(lsb + 1, lsb + n + 1, b[i]) - lsb; Map[a[i]] = i; } for (int i = 1; i <= n; i++) b[i] = Map[b[i]]; merge_sort(b, 1, n); cout << ans << endl; return 0; }