HDU 1394 (逆序数) Minimum Inversion Number
原来求逆序数还可以用线段树,涨姿势了。
首先求出原始序列的逆序数,然后递推每一个序列的逆序数。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ; int n, p, qL, qR;
int sum[maxn], a[ + ]; void update(int o, int L, int R)
{
if(L == R) { sum[o]++; return; }
int M = (L + R) / ;
if(p <= M) update(o*, L, M);
else update(o*+, M+, R);
sum[o] = sum[o*] + sum[o*+];
} int query(int o, int L, int R)
{
if(qL <= L && qR >= R) return sum[o];
int ans = ;
int M = (L + R) / ;
if(qL <= M) ans += query(o*, L, M);
if(qR > M) ans += query(o*+, M+, R);
return ans;
} int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%d", &n) == )
{
memset(sum, , sizeof(sum)); for(int i = ; i < n; i++) scanf("%d", &a[i]);
int inv = ;
for(int i = ; i < n; i++)
{
p = a[i];
qL = a[i]; qR = n - ;
inv += query(, , n - );
update(, , n - );
}
int ans = inv;
for(int i = ; i < n; i++)
{
inv = inv + n - a[i]* - ;
ans = min(ans, inv);
}
printf("%d\n", ans);
} return ;
}
线段树
既然要求逆序数了,干脆树状数组,归并排序也都试一试。
由于树状数组lowbit的特点,所以数组下标是从1开始的。但是树状数组要比线段树好写很多。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int n;
int a[maxn], s[maxn]; inline int lowbit(int x) { return x&(-x); } int sum(int x)
{
int ans = ;
while(x > ) { ans += s[x]; x -= lowbit(x); }
return ans;
} void add(int x, int d)
{
while(x <= n) { s[x] += d; x += lowbit(x); }
} int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%d", &n) == )
{
memset(s, , sizeof(s));
for(int i = ; i < n; i++) { scanf("%d", &a[i]); a[i]++; }
int inv = ;
for(int i = ; i < n; i++)
{
inv += sum(n) - sum(a[i]);
add(a[i], );
}
int ans = inv;
for(int i = ; i < n; i++)
{
inv = inv + n + - a[i]*;
ans = min(ans, inv);
}
printf("%d\n", ans);
} return ;
}
树状数组
下面是归并排序,_(:зゝ∠)_
代码不长,但是感觉还是挺容易写错的。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ;
int n, inv;
int a[maxn], b[maxn], T[maxn]; void MergeSort(int x, int y)
{
if(y - x > )
{
int m = (x + y) / ;
int p = x, q = m, i = x;
MergeSort(x, m); MergeSort(m, y);
while(p < m || q < y)
{
if(q >= y || (p < m && a[p] <= a[q])) T[i++] = a[p++];
else { T[i++] = a[q++]; inv += m - p; }
}
for(i = x; i < y; i++) a[i] = T[i];
}
} int main()
{
//freopen("in.txt", "r", stdin); while(scanf("%d", &n) == )
{
for(int i = ; i < n; i++) { scanf("%d", &a[i]); b[i] = a[i]; }
inv = ;
MergeSort(, n);
int ans = inv;
for(int i = ; i < n; i++)
{
inv = inv + n - - b[i]*;
ans = min(ans, inv);
}
printf("%d\n", ans);
} return ;
}
归并排序
HDU 1394 (逆序数) Minimum Inversion Number的更多相关文章
- HDU 1394 & ZOJ 1484 Minimum Inversion Number
(更新点查询区间) 这题重在想到,写代码很容易了..这题是利用线段树求逆序数,不按给定的顺序建树,而是有序地插入.比如每插入一个数,就统计之前插入的那些数里比他大的有多少个,这个数就是此时的逆序数,然 ...
- 线段树 逆序对 Minimum Inversion Number HDU - 1394 Laptop
Minimum Inversion Number HDU - 1394 求最小反转数,就是求最少的逆序对. 逆序对怎么求,就是先把所有的数都初始化为0,然后按照顺序放入数字,放入数字前查询从这个数往后 ...
- HDU 1394 逆序数 线段树单点跟新 | 暴力
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- hdu 1394 逆序数(线段树)
http://acm.hust.edu.cn/vjudge/problem/15764 http://blog.csdn.net/libin56842/article/details/8531117 ...
- 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(线段树求最小逆序数对)
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 ...
随机推荐
- BZOJ2463: [中山市选2009]谁能赢呢?
感慨下汉堡的找水题能力… /************************************************************** Problem: 2463 User: zhu ...
- Sublime Text3激活 破解
Sublime Text 是一个复杂的文本.代码编辑器.出色用户界面,非凡的功能和惊人的性能. Sublime Text 3 官方网站 http://www.sublimetext.com/ 点击菜单 ...
- 白话CSS3的新特性
声明:这篇文章不是手册,所以不会说的很详细,只是告诉初学者CSS3显著的改进有啥,高手老手绕行. 一.在边框上的改进 1.可以给方框加圆角了,值越大越圆,解决了过去大方框的不美观 2.可以给控件加阴影 ...
- adb或appium下多设备中指定设备的启动
一.先用adb devices列出所有设备序列号 List of devices attached012BDC7N78954789 device132AEC8N57897458 device 二.进入 ...
- ubuntu第一次设置root密码
安装ubuntu时,系统让用户创建了一个非root用户,系统启动后使用这个用户,在需要执行超级用户权限的指令时,可以通过sudo来执行.为此我们可以通过这样的方式修改root的密码:dengfei@d ...
- Good Bye 2015 A. New Year and Days 签到
A. New Year and Days Today is Wednesday, the third day of the week. What's more interesting is tha ...
- (一)初探HTML!
想自己动手做一个个人网站,因此,最近在自学PHP,主要看韩顺平老师的教学视频..将自己学习的点点滴滴记录在博客园,希望数月之后,自己可以熟练的运用PHP,也希望各位PHP高手们给予指点,不胜感激!! ...
- ABP集合帖
http://www.cnblogs.com/kebinet/p/5341663.html http://www.cnblogs.com/farb/p/ABPAdvancedTheoryContent ...
- SSH乱码和Xshell异常断开解决方法
一.SSH Secure Shell Client中文乱码的解决方法 这是SSH Secure Shell Client多年未解决的短板,要求客户端和服务器端都要‘UTF-8’编码,我终于知道Wind ...
- C++运算符重载——重载一元运算符
0.重载一元操作符的方法 一元运算符即只需要一个操作用的运算符,如取地址运算符(&).复数(-).自减(--).自加(++)等. 运算符重载可以分为3种方式:类的非静态成员函数.类的友元函数. ...