题目传送门

 /*
求逆序数的四种方法
*/

 /*
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的更多相关文章

  1. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  2. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  3. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  4. HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  5. hdu 1394 Minimum Inversion Number 逆序数/树状数组

    Minimum Inversion Number Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showprob ...

  6. hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)

    http://acm.hdu.edu.cn/showproblem.php?pid=1394  //hdu 题目   Problem Description The inversion number ...

  7. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  8. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  9. [HDU] 1394 Minimum Inversion Number [线段树求逆序数]

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

随机推荐

  1. spring 注解的总结

    一.java内置注解 1.@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括: ElemenetType.CONSTRUCTOR   构造器声明 ElemenetTyp ...

  2. 使用多种方式实现遍历HashMap

    今天讲解的主要是使用多种方式来实现遍历HashMap取出Key和value,首先在java中如果想让一个集合能够用for增强来实现迭代,那么此接口或类必须实现Iterable接口,那么Iterable ...

  3. 直接拿来用!超实用的Java数组技巧攻略

    java编程语言经验分享 摘要:本文分享了关于Java数组最顶级的11大方法,帮助你解决工作流程问题,无论是运用在团队环境或是在私人项目中,你都可以直接拿来用. 本文分享了关于Java数组最顶级的11 ...

  4. 他们在军训,我在搞 OI(一)

    Day 1 理论上,我现在不应该坐在电脑前打字,因为早在今天上午 6:20 全体新高一同学就坐车前往军(无)训(尽)基(炼)地(狱)了,而今天上午 6:20 我还在被窝里呢…… 没错,我旷掉了军训,然 ...

  5. nginx(三)初步搭建nginx虚拟主机

    上面就是nginx基于域名.ip访问的配置,掌握住格式,就很好配置了. 一.基于域名的虚拟主机的配置:1.我们在此复习一下DNS的配置:[root@mgmserver /]# hostnamemgms ...

  6. linux之eval用法(高级bash程序员的必修之技)

    1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...

  7. 【云计算】docker daemon如何提供Restful的API

    Docker Remote API 如何使用? docker 的 Remote API 定义如下: 这个API看着是http协议的但是我用 curl http://127.0.0.1:4243/con ...

  8. 基础知识《四》---Java多线程学习总结

    本文转载自51cto 一.线程的基本概念简单的说:线程就是一个程序里不同的执行路径,在同一个时间点上cpu只会有一个线程在执行,Java里的多线程是通过java.lang.Thread类来实现的,每个 ...

  9. 38.输出1到最大的N位数[Print 1 to max number of N bits]

    [题目] 输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. [分析] 这是一道很有意思的题目.看起来很简单,其实里面却有不少的玄机. [常规思路 ...

  10. android.mk文件里的通配符

    比方你有如下目录,要编译Classes目录和Code目录下所有cpp src |-android.mk |-Classes |-A.cpp |-B.cpp |-....cpp |-Code |-E.c ...