逆序数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 ...
随机推荐
- editplus快捷键大全其他editplus快捷键
editplus快捷键大全其他editplus快捷键,更多快捷键请参考以下文章:editplus快捷键大全之editplus搜索快捷键 editplus快捷键大全之editplus编辑快捷键 edit ...
- 淘宝(阿里百川)手机客户端开发日记第三篇 SlidingPaneLayout实现侧滑菜单
需要的三个布局文件: activity_main.xml :主窗体布局 left.xml : 左侧栏目分类布局 right.xml : 右侧内容详情 需要的组件: android.support.v4 ...
- iOS高级必备
1.你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗? Objecitve-C的 ...
- C#模拟POST登录cnblogs并发布文章
用到的工具FireFox的Firebugs插件 打开网络功能进行抓包 数据如下 可以得知POST的数据为: __EVENTTARGET=&__EVENTARGUMENT=&__VIEW ...
- java中queue的使用
Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Queue接 口.Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类 ...
- centos7 安装kvm, 并创建虚拟机
# yum –y install qemu-kvm qemu-img bridge-utils # yum –y install libvirt virt-install virt-manager # ...
- 【云计算】Docker集中化web界面管理平台shipyard
Docker集中化web界面管理平台shipyard docker shipyard seanlook 2015年01月05日发布 ...
- sharepoint获取域名和当前登录的应为名字
string a = SPContext.Current.Web.CurrentUser.ToString(); int length = a.IndexOf("w|", 0) ...
- poj 2709
http://poj.org/problem?id=2709 题意:就是那个老师需要n瓶颜色的墨水,和1瓶颜色的灰色的墨水,但是灰色的墨水没得卖,只能由三种颜色相同的墨水混合而成,但是3瓶50ML的墨 ...
- UML 序列图一点理解
激活状态,就是长方形该画到哪里呢?我的理解是,一个长方形代表调用函数的执行过程,比如下图 这个长方形就表示viewDidAppear()函数没有执行完,在这个长方形上发出或者收到的消息都是在 view ...