Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using lli = long long;
- vector <int> srt;
- int n, m;
- lli merge(int left, int mid, int right){
- int temp[n+m];
- int i = left, j = mid, k = left;
- lli cnt = 0;
- while ((i <= mid - 1) && (j <= right)){
- if (srt[i] > srt[j]) {
- temp[k] = srt[i];
- k ++;
- i ++;
- }
- else {
- temp[k] = srt[j];
- k ++;
- j ++;
- cnt = cnt + (lli)(mid - i);
- }
- }
- while (i <= mid - 1){
- temp[k] = srt[i];
- k ++;
- i ++;
- }
- while (j <= right){
- temp[k] = srt[j];
- k ++;
- j ++;
- }
- for (i = left; i <= right; i++)
- srt[i] = temp[i]; //
- return cnt;
- }
- lli Sort(int left, int right){
- if(right <= left) return 0;
- int mid = (right + left) / 2;
- lli cnt = Sort(left, mid);
- cnt += Sort(mid + 1, right);
- cnt += merge(left, mid + 1, right);
- return cnt;
- }
- int main() {
- scanf("%d%d", &n, &m);
- if (n == 1) {
- int x;
- lli cnt = 0;
- scanf("%d", &x);
- for(int i=2;i<=m+1;i++){
- scanf("%d", &x);
- cnt += (lli) i - 1;
- }
- printf("%lld", cnt);
- }
- else {
- int H[n + 1];
- for (int i = 1; i <= n; i++) {
- scanf("%d", &H[i]);
- }
- double median;
- if(n % 2 == 1) median = H[n/2 + 1];
- else median = (H[n/2] + H[n/2 + 1]) / 2;
- int R[m+1];
- int l = 1, r = 1;
- for (int i = 1; i <= m; i++){
- int S;
- scanf("%d", &S);
- if(S <= median) {
- srt.push_back(S);
- l ++;
- }
- else {
- R[r] = S;
- r ++;
- }
- }
- sort(srt.begin(), srt.end());
- sort(R+1, R+r);
- for(int i=1;i<=n;i++) srt.push_back(H[i]);
- for(int i=1;i<r;i++){
- srt.push_back(R[i]);
- }
- printf("%lld", Sort(0, n + m - 1));
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement