#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <ctime> #include <map> #include <set> #define eps 1e-12 ///#define M 1000100 ///#define LL __int64 #define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)<eps)?0:x) using namespace std; const int maxn = 30100; LL a[maxn]; LL temp[maxn]; LL sum; struct node { LL y1; LL y2; int id; }f[maxn]; void Merge(LL a[], int l, int mid, int r) { int begin1 = l; int end1 = mid; int begin2 = mid+1; int end2 = r; int k = 0; while(begin1 <= end1 && begin2 <= end2) { if(a[begin1] < a[begin2]) { temp[k++] = a[begin1]; begin1++; sum += begin2-(mid+1); } else { temp[k++] = a[begin2]; begin2++; } } while(begin1 <= end1) { temp[k++] = a[begin1]; begin1++; sum += end2-mid; } while(begin2 <= end2) { temp[k++] = a[begin2]; begin2++; } for(int i = l; i <= r; i++) a[i] = temp[i-l]; } void MergeSort(LL a[], int l, int r) { int mid = (l+r)>>1; if(l < r) { MergeSort(a, l, mid); MergeSort(a, mid+1, r); Merge(a, l, mid, r); } }
时间: 2024-12-29 01:34:18