逆序数2 HDOJ 1394 Minimum Inversion Number
/*
求逆序数的四种方法
*/
/*
1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N]
它的逆序列个数是N个,如果把t[1]放到t[N]后面,逆序列个数会减少t[1]个,相应会增加N-(t[1]+1)个
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAX_N = + ;
const int INF = 0x3f3f3f3f;
int a[MAX_N];
int num[MAX_N]; int main(void) //HDOJ 1394 Minimum Inversion Number
{
//freopen ("inC.txt", "r", stdin);
int n; while (~scanf ("%d", &n))
{
memset (num, , sizeof (num));
for (int i=; i<=n; ++i)
{
scanf ("%d", &a[i]);
//a[n+i] = a[i];
}
int t = ; int sum = ;
for (int i=; i<=n; ++i) //先求解最初的数列逆序数
{
for (int j=i+; j<=n; ++j)
{
if (a[i] > a[j])
{
sum++;
}
}
}
//printf ("%d\n", sum);
int ans = INF;
for (int i=; i<=n; ++i) //更新sum,找最小
{
sum = sum - a[i] + (n - a[i] - ); //the next line contains a permutation of the n integers from 0 to n-1.
//printf ("%d\n", res); //从0到n-1的整数 所以这里用a[i] 读题不仔细 。。。。
ans = min (sum, ans);
}
printf ("%d\n", ans);
} return ;
}
O(n^2) 暴力+递推
/*
2. 归并算法
*/
#include <cstdio>
#include <algorithm>
using namespace std; const int MAX_N = + ;
const int INF = 0x3f3f3f3f;
int a[MAX_N];
int b[MAX_N];
int L[MAX_N/+], R[MAX_N/+];
int cnt = ; void Merge(int *a, int p, int q, int r)
{
int n1 = q - p + ;
int n2 = r - q;
int i, j; for (i=; i<=n1; ++i)
{
L[i] = a[p+i-];
}
for (j=; j<=n2; ++j)
{
R[j] = a[q+j];
}
L[n1+] = R[n2+] = INF;
i = j = ;
for (int k=p; k<=r; ++k)
{
if (L[i] <= R[j])
{
a[k] = L[i++];
}
else
{
a[k] = R[j++];
cnt += n1 - i + ;
}
}
} void MergeSort(int *a, int p, int r)
{
if (p < r)
{
int q = (p + r) / ;
MergeSort (a, p, q);
MergeSort (a, q+, r);
Merge (a, p, q, r);
}
} int main(void) //HDOJ 1394 Minimum Inversion Number
{
//freopen ("inC.txt", "r", stdin);
int n;
while (~scanf ("%d", &n) && n)
{
for (int i=; i<=n; ++i)
{
scanf ("%d", &a[i]);
b[i] = a[i];
}
MergeSort (a, , n);
//printf ("%d\n", cnt);
int ans = INF;
for (int i=; i<=n; ++i) //注意a[i]已排序
{
cnt = cnt - b[i] + (n - b[i] - );
ans = min (cnt, ans);
}
printf ("%d\n", ans);
cnt = ;
} return ;
}
nlogn 归并排序
/*
3. nlogn 线段树-单点更新:更新比a[i]大的个数
*/
#include <cstdio>
#include <algorithm>
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1 | 1 const int MAX_N = + ;
const int INF = 0x3f3f3f3f;
int a[MAX_N];
int sum[MAX_N << ]; void pushup(int rt)
{
sum[rt] = sum[rt << ] + sum[rt << | ];
} void build(int l, int r, int rt)
{
sum[rt] = ;
if (l == r) return ;
int m = (l + r) >> ;
build (lson);
build (rson);
} void update(int p, int l, int r, int rt)
{
if (l == r)
{
sum[rt]++; //记录次数
return ;
}
int m = (l + r) >> ;
if (p <= m)
{
update (p, lson);
}
else
update(p, rson);
pushup (rt);
} int query(int ql, int qr, int l, int r, int rt)
{
if (ql <= l && r <= qr)
{
return sum[rt];
}
int m = (l + r) >> ;
int ans = ;
if (ql <= m) ans += query (ql, qr, lson);
if (qr > m) ans += query (ql, qr, rson); return ans;
} int main(void) //HDOJ 1394 Minimum Inversion Number
{
//freopen ("inC.txt", "r", stdin);
int n;
while (~scanf ("%d", &n))
{
//memset (num, 0, sizeof (num));
build (, n-, );
int sum = ;
for (int i=; i<=n; ++i)
{
scanf ("%d", &a[i]);
sum += query (a[i], n-, , n-, );
update (a[i], , n-, );
}
int ans = sum;
for (int i=; i<=n; ++i)
{
sum = sum - a[i] + (n - a[i] - );
ans = std::min (sum, ans);
}
printf ("%d\n", ans);
} return ;
}
nlogn 线段树-单点更新
/*
4. 树状数组
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=;
int c[MAXN];
int a[MAXN];
int n; int lowbit(int x)
{
return x&(-x);
} void add(int i,int val)
{
while(i<=n)
{
c[i]+=val;
i+=lowbit(i);
}
} int sum(int i)
{
int s=;
while(i>)
{
s+=c[i];
i-=lowbit(i);
}
return s;
} int main() //HDOJ 1394 Minimum Inversion Number
{
//freopen ("inC.txt", "r", stdin);
while(scanf("%d",&n)!=EOF)
{
int ans=;
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]++;
ans+=sum(n)-sum(a[i]);
add(a[i],);
}
int Min=ans;
for(int i=;i<=n;i++)
{
ans+=n-a[i]-(a[i]-);
if(ans<Min)Min=ans;
}
printf("%d\n",Min);
} return ;
}
树状数组
逆序数2 HDOJ 1394 Minimum Inversion Number的更多相关文章
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意: 给一个序列由 ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- hdu 1394 Minimum Inversion Number 逆序数/树状数组
Minimum Inversion Number Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showprob ...
- hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)
http://acm.hdu.edu.cn/showproblem.php?pid=1394 //hdu 题目 Problem Description The inversion number ...
- HDU 1394 Minimum Inversion Number(最小逆序数 线段树)
Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- [HDU] 1394 Minimum Inversion Number [线段树求逆序数]
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
随机推荐
- AJAX创建表格,删除数据
主页面 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...
- Linux大神必备-文本编辑器
导读 我们在 Linux 上不缺乏非常现代化的编辑软件,但是它们都是基于 GUI(图形界面)的编辑软件.正如你所了解的:Linux 真正的魅力在于命令行,当你正在用命令行工作时,你就需要一个可以在控制 ...
- [Unity3D]图形渲染优化、渲染管线优化、图形性能优化
原地址:http://blog.sina.com.cn/s/blog_5b6cb9500101dmh0.html 转载请留下本文原始链接,谢谢.本文会不定期更新维护,最近更新于2013.11.09 ...
- index and polymorphic
http://guides.rubyonrails.org/association_basics.html#polymorphic-associations class CreateStars < ...
- BNUOJ 1038 Flowers
春天到了,师大的园丁们又开始忙碌起来了. 京师广场上有一块空地,边界围成了一个多边形,内部被划分成一格一格的.园丁们想在这个多边形内的每一格内种植一些花. 现在请你帮忙计算一下一共最多可以种多少花. ...
- HTML5 自制本地网页视频播放器
HTML5初试:本地视频用网页打开啦半个广告都可以没有,看来暴风什么的快要淘汰了. 视频格式还是有要求的,看来要备一个转码器. 格式 IE Firefox Opera Chrome Safari Og ...
- openstack 前期准备工作
OS 是 centos6.5_X86_64 一.vmware 虚拟机 准备两台机虚拟机即可 二.导入第三方安装源 [root@openstack ~]# rpm -Uvh http://dl.fedo ...
- python 的编码问题
老是碰到这个问题,决定好好给整理一番思路. 翻阅资料和实践证明,以下论述为真理: 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将 ...
- 如何解决Eclipse启动时画面一闪而过
以前Eclipse都可以正常使用,突然有一天不能启动了,点击图标后启动画面一闪之后就消失了,以下是一些解决方案 1. 找到Eclipse目录下的eclipse.exe,右键点击->发送到桌面快捷 ...
- 每天一个脚本解析day1==》《service xxxxx status》之service脚本解析
vim /sbin/service #!/bin/sh . /etc/init.d/functions #读取环境变量. VERSION="$(basename $0) ver. 0. ...