POJ 4020 NEERC John's inversion 贪心+归并求逆序对
题意:给你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 贪心+归并求逆序对的更多相关文章
- 浙江工商大学15年校赛I题 Inversion 【归并排序求逆序对】
Inversion Time Limit 1s Memory Limit 131072KB Judge Program Standard Ratio(Solve/Submit) 15.00%(3/20 ...
- POJ 2299 Ultra-QuickSort 离散化加树状数组求逆序对
http://poj.org/problem?id=2299 题意:求逆序对 题解:用树状数组.每读入一个数x,另a[x]=1.那么a数列的前缀和s[x]即为x前面(或者说,再x之前读入)小于x的个数 ...
- 2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)
题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后 ...
- POJ 3067 - Japan - [归并排序/树状数组(BIT)求逆序对]
Time Limit: 1000MS Memory Limit: 65536K Description Japan plans to welcome the ACM ICPC World Finals ...
- HDU-1394 Minimum Inversion Number 线段树+逆序对
仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...
- 51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)
1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线 ...
- 归并求逆序数(逆序对数) && 线段树求逆序数
Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java c ...
- 树状数组求逆序对:POJ 2299、3067
前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
随机推荐
- 永恒之蓝(EternalBlue)MS17-010
附加知识: 漏洞来源与背景: 这个漏洞最初是由NSA(美国国家安全局)发现的,但是他们发现漏洞他不讲,然后遭殃了吧. 后来 有一个黑客组织叫:Shadow Brokers (影子经纪人) 入侵了NSA ...
- Gridview 每秒刷新数据
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx. ...
- Linux 系统初始化和服务
系统的初始化和服务 1. Linux 系统启动流程 打开计算机,从主板 BIOS(Basic Input/Out System)读取其中所存储的程序,引导你找到存储系统的硬件(如光盘.硬盘等) 接下来 ...
- js读取excel中日期格式转换问题
在使用js-xlsx插件来读取excel时,会将2018/10/16这种数据自动装换成48264.12584511. 所以需要自己手动再转换回来 // excel读取2018/01/01这种时间格式是 ...
- Unite 2017 干货整理 优化篇
Unite 2017 干货整理 优化篇 2017年05月16日 将Unite 2017的一些演讲做了整理. 本篇有内存,CPU.GC.UI.渲染性能指标.Tips几个小节. 内容持续整理中. 内存 ...
- 在Mybatis中处理sql中的大于号小于号
因为xml格式中,不能随便出现"<".“>”等符号,所以在sql中这一类的符号要进行特殊处理 第一种方法:使用转义字符替换特殊的符号 例如 SELECT * FROM ...
- NOIp知识集合 By cellur925
基本算法 快速幂 ll ksm(ll a,ll b) { ll ans=; while(b) { ) ans=ans*a%p; b>>=; a=a*a%p; } return ans; } ...
- 在centos中安装最新版nginx,同时更改官方文档路径错误
nginx的可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g ++开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译 ...
- Hive进阶_Hive的表连接
等值连接 select e.empno, d.deptno from emp e, dept d where e.deptno=d.deptno; 不等值连接 select e.empno, e.en ...
- Net Core 2.0 Redis
Net Core 2.0 Redis配置.封装帮助类RedisHelper及使用实例 https://www.cnblogs.com/oorz/p/9052498.html 本文目录 摘要 Redis ...