ACM ICPC 2011–2012, NEERC, Northern Subregional Contest J. John’s Inversions(合并排序求逆序数对数)

题目链接:http://codeforces.com/gym/100609/attachments
题目大意:有n张牌,每张牌有红色和蓝色两面,两面分别写了一些数字,同种颜色的任意两个数字若排在前面的数字比排在后面的数字大就叫做一对逆序数。求怎样排序得到的逆序数对最少。
解题思路:其中一种颜色的数字是顺序且这种颜色数字相同时对应的另一种颜色的数字是顺序时得到的逆序数对数最少。难点在于求逆序数对数。因为数量很大O(n^2)复杂度不能满足,这里根据合并排序的原理求解每个数字前面有多少个比它大的数字,最后加起来就是答案。合并排序复杂度是O(n)。
代码如下:
#include 
#include 
#include 
#define ll long long
using namespace std; 
const int maxn=100005;
ll ans;
int data[maxn];
int n;
struct node
{
    int a,b;
}s[maxn];
ll cmp(node p,node q) 
{
    if(p.a==q.a)
        return p.b


你可能感兴趣的:(ACM_数据结构,归并排序,求逆序数对数)