CF1915F Greetings

链接:https://www.luogu.com.cn/problem/CF1915F
题目:
比较隐蔽的逆序对问题
先按begin排:sort
然后再用归并记录end的逆序

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;
struct peo
{
	ll begin, end;
}peolst[200010];
ll n;
ll answ;
bool cmp1(peo a, peo b) { return a.begin < b.begin; }
int t;
int b[200010];
void merge(ll lla, ll mi, ll rr)
{
	ll l = lla, mid = mi +1 , r = rr;
	ll ptr = l;
	while (l < mi+1  and mid <= rr)
	{
		if (peolst[l].end > peolst[mid].end)
		{
			answ+=mi-l+1;
			b[ptr++] = peolst[mid++].end;
		}
		else
		{
			b[ptr++] = peolst[l++].end;
		}
	}
	while (mid <= rr)b[ptr++] = peolst[mid++].end;
	while (l < mi + 1)
	{
		b[ptr++] = peolst[l++].end;
	}
	for (int i = lla; i <= rr; i++)
	{
		peolst[i].end = b[i];
	}
}
void mergesort(ll lla, ll rr)
{
	if (lla >= rr)return;
	ll l = lla, r = rr, mid = lla + (rr - lla) / 2;
	mergesort(lla, mid);
	mergesort(mid + 1, rr);
	merge(lla, mid, rr);
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	cin >> t;
	while (t--)
	{
		answ = 0;
		cin >> n;
		for (int i = 0; i < n; i++)cin >> peolst[i].begin >> peolst[i].end;
		sort(peolst, peolst + n, cmp1);
		mergesort(0, n - 1);
		cout << answ << endl;
	}
	return 0;
}

posted on 2024-04-07 15:01  WHUStar  阅读(7)  评论(0编辑  收藏  举报