题意:给你n张卡,每张卡上有蓝色和红色的两种数字,求一种排列使得对应颜色数字之间形成的逆序对总数最小

题解:贪心,先按蓝色排序,数字相同再按红色排,那么蓝色数字的逆序总数为0,考虑交换红色的数字消除逆序,

那么这个操作的代价是蓝色的数字逆序对增加2*len-3,而红色的数字交换最多也只能消除那么多对逆序对。不会比当前更优。

因为数据范围比较大,用树状数组,线段树,可能要离散,所以学习了归并排序的方法来求逆序对总数。

思路大概是,归并之前的左右两个序列是已经排好序的,分别叫做L和R,如果L(i)>R(j),那么R(j)也一定比L(i+1)以后的小,就算一下逆序对。归并排序又是先把小的给并入,所以不会少计算逆序对。

#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = ; struct Unit
{
int r,b;
bool operator < (const Unit& rhs) const {
return r < rhs.r || ( r == rhs.r && b < rhs.b );
}
}a[maxn]; int t[maxn];
long long cnt;
void merge_sort(int l,int r)
{
if(l==r) return;
int mid = l+r>>;
merge_sort(l,mid);
merge_sort(mid+,r);
int i = l, j = mid+, k =l,p;
while(i <= mid && j <= r){
if(a[i].b>a[j].b){
cnt += mid-i+;
t[k] = a[j].b;
j++;
} else {
t[k] = a[i].b;
i++;
}
k++;
}
if(i == mid + ) for(p = j; p <= r; p++) t[k++] = a[p].b;
else for(p = i; p <= mid; p++) t[k++] = a[p].b;
for(k = l;k <= r; k++) a[k].b = t[k];
} int main()
{
int n;
scanf("%d",&n);
for(int i = ; i < n; i++){
scanf("%d%d",&a[i].r,&a[i].b);
}
sort(a,a+n);
cnt = ;
merge_sort(,n-);
printf("%I64d",cnt); return ;
}

在贴一份的各种情况的merge_sort

//[l,r] and need an array (t[])
void merge_sort(int l,int r)
{
if(l == r) return;
int mid = (l+r) >> ;
merge_sort(l,mid);
merge_sort(mid+,r);
int p = l, q = r, k = l;
while(p <= mid && q <= r){
if(a[p]>a[q]) {
// inv += mid - p + 1
t[k++] = a[q++];
} else {
t[k++] = a[p++];
}
}
if(p>mid) for(int i = q; i <= r; i++) t[k++] = a[i];
else for(int i = q; i <= mid; i++) t[k++] = a[i];
for(k = l; k <= r; i++) a[k] = t[k];
} // [l r)
void merge_sort(int l,int r)
{
if(r-l<=) return;
int m = (l+r)>>;
merge_sort(l,m);
merge_sort(m,r);
int p = l, q = m, i = l;
while(p < m || q < r){
if(q >= r || (p<m && a[p] <= a[q]) ) t[i++] = a[p++];
else {
// inv += m-p;
t[i++] = a[p++];
}
}
for(i = l; i < r; i++) a[i] = t[i];
}

POJ 4020 NEERC John's inversion 贪心+归并求逆序对的更多相关文章

  1. 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】

    Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...

  2. POJ 2299 Ultra-QuickSort 离散化加树状数组求逆序对

    http://poj.org/problem?id=2299 题意:求逆序对 题解:用树状数组.每读入一个数x,另a[x]=1.那么a数列的前缀和s[x]即为x前面(或者说,再x之前读入)小于x的个数 ...

  3. 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

    题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后 ...

  4. POJ 3067 - Japan - [归并排序/树状数组(BIT)求逆序对]

    Time Limit: 1000MS Memory Limit: 65536K Description Japan plans to welcome the ACM ICPC World Finals ...

  5. HDU-1394 Minimum Inversion Number 线段树+逆序对

    仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...

  6. 51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)

    1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题   二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线 ...

  7. 归并求逆序数(逆序对数) && 线段树求逆序数

    Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u   Java c ...

  8. 树状数组求逆序对:POJ 2299、3067

    前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换 ...

  9. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

随机推荐

  1. maven工程导入eclipse后报错

    原因:需要重新部署下tomcat环境 解决方式: 右击->属性:

  2. 在windows10环境下给PHPStorm配置xdebug断点调试功能

    笔者的开发环境: wampserver2.5系统环境包 操作系统:windows10 64位专业版. php版本:php5.512 Apache版本:2.49 好了下面介绍,phpstorm配置xde ...

  3. SQL将一个表中的某一列值全部插入到另一个表中

    1.  SQL将一个表中的某一列值全部插入到另一个表中 插入的话: insert into a(col) select col from b; 更新的话: update a set col=selec ...

  4. OVS编译

    下载源码 # git clone https://github.com/openvswitch/ovs.git # cd ovs # git checkout branch-2.8 下载依赖包 # y ...

  5. Unity学习(十三)场景优化之四叉树

    http://blog.sina.com.cn/s/blog_89d90b7c0102wyfw.html 四叉树是在二维图片中定位像素的唯一适合的算法.因为二维空间(图经常被描述的方式)中,平面像素可 ...

  6. 洛谷P3080 [USACO13MAR]牛跑The Cow Run

    P3080 [USACO13MAR]牛跑The Cow Run 题目描述 Farmer John has forgotten to repair a hole in the fence on his ...

  7. 洛谷P3110 [USACO14DEC]驮运Piggy Back

    P3110 [USACO14DEC]驮运Piggy Back 题目描述 贝西和她的妹妹艾尔斯白天在不同的地方吃草,而在晚上他们都想回到谷仓休息.聪明的牛仔,他们想出了一个计划,以尽量减少他们在步行时花 ...

  8. pytest框架(三)

    pytharm运行三种方式 代码示例: # coding=utf-8 import pytest class TestClass: def test_one(self): x = "this ...

  9. 浅谈css常用伪类用法

    着重写一下after和before的用法: css样式搞定:标签元素+伪类after a.'class名':after{//我的样式名称是这个,可以写成你自己的样式名称 content: '已打包'; ...

  10. 黑马MyBatisday2 MyBatis Dao层实现 接口代理实现&传统实现 动态SQL和SQL抽取 自定义类型处理 分页插件PageHelper

    package com.itheima.mapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelp ...