HDU 1394 Minimum Inversion Number(线段树 或 树状数组)
题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1。可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2,A3...An-1,A0,A1 。我们定义逆序对<Ai,Aj>满足 i < j 且Ai > Aj 。 在所有的序列中找出逆序对最少的序列,输出逆序对个数。num[n+1]存储序列元素。
思路: 假设某个序列的逆序对个数为 sum 则下一个序列的逆序对个数为 sum - num[1] + (n - 1) - num[1]。则只需要求出原始序列的逆序对个数计科推出后面的所有序列的逆序对个数。
再输入每个元素的时候统计区间 [num[i]+1,n-1] 之间的元素已经能出现的总次数,则可以用线段树,或树状数组统计。下面给出两种方法的代码。
树状数组:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
int a[5010],c[5010],n;
int lowbit(int x){
return x & (-x) ;
}
void add(int x,int d){
while(x <= n){
c[x] += d;
x = x + lowbit(x) ;
}
}
int getsum(int x){
int ans = 0;
while(x > 0){
ans += c[x] ;
x = x - lowbit(x) ;
}
return ans ;
}
int main(){
int i,j,x,num[5010];
while(~scanf("%d",&n) && n){
int sum = 0;
memset(c,0,sizeof(c));
for(i=1;i<=n;i++){
scanf("%d",&x) ;
num[i] = x ;
x ++ ;
sum += getsum(n) - getsum(x) ;
add(x,1);
}
int ans = sum ;
for(i=1;i<n;i++){
sum = sum - (num[i] + 1) + n - num[i] ;
ans = min(ans,sum);
}
cout << ans << endl;
}
return 0;
}
线段树
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 0x7fffffff
int n,x;
struct node{
int l,r,sum;
}a[20100];
void buildtree(int i,int l,int r){
a[i].l = l ;
a[i].r = r;
a[i].sum = 0;
if(l == r)
return ;
int mid = (l+r)/2;
buildtree((i<<1),l,mid);
buildtree(i*2+1,mid+1,r);
}
int query(int i,int l,int r){
if(l>r)
return 0;
if(a[i].l == l && a[i].r == r)
return a[i].sum;
int sum = 0;
int mid = (a[i].l + a[i].r) / 2 ;
if(r<=mid)
sum = query(i*2,l,r);
else if(l > mid)
sum = query(i*2+1,l,r);
else
sum = query(i*2,l,mid) + query(i*2+1,mid+1,r) ;
return sum ;
}
void update(int i,int x){
if(a[i].l == x && a[i].r == x){
a[i].sum ++;
}
else{
a[i].sum ++;
int mid = (a[i].l + a[i].r) / 2 ;
if(x<=mid)
update(i*2,x);
else
update(i*2+1,x);
}
}
int main(){
int i,j,sum,num[5010];
while(~scanf("%d",&n) && n ){
sum = 0 ;
buildtree(1,0,n-1);
for(i=1;i<=n;i++){
scanf("%d",&x);
num[i] = x ;
sum += query(1,x+1,n-1);
update(1,x);
}
int ans = sum;
for(i=1;i<n;i++)
{
sum = sum - num[i] + n-num[i]-1 ;
ans = min(ans,sum);
}
cout << ans << endl ;
}
return 0;
HDU 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: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- hdu - 1394 Minimum Inversion Number(线段树水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...
- HDU 1394 Minimum Inversion Number 线段树
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...
- 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(线段树/树状数组求逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU 1394 Minimum Inversion Number(最小逆序数 线段树)
Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...
随机推荐
- zoj3640:概率(期望)dp
题目大意:有一个吸血鬼,初始攻击力为f,每天随机走到n个洞里面,每个洞有一个c[i],如果他的攻击力f>c[i] 则可以花费t[i] 的时间逃走,否则则花费一天时间使自己的攻击力增加c[i],求 ...
- Install and configure sql server 2008 express
http://www.symantec.com/connect/articles/install-and-configure-sql-server-2008-express
- python高级编程:缓存
# -*- coding: utf-8 -*-__author__ = 'Administrator'#缓存"""对于运行代价很高的函数和方法结果,可以进行缓存,只要:1 ...
- [RxJS] Changing Behavior with MapTo
You often need streams to trigger different behaviors on the data based on which streams triggers. T ...
- CSS元素 之 float
1. float 设计的初衷 Float 设计的初衷是为了文字环绕的效果 使得文字可以围绕着 图片.就像下面这样 2. float 的包裹和 破坏 A) 包裹性 和 破坏性 例如下图 我们原本是希 ...
- HTML与CSS入门——第十章 创建用于Web上的图像
知识点: 1.选择图像软件的方法 2.准备用于网上的照片的方法 3.创建标题和按钮的方法 4.减少图像中颜色数量的方法 5.创建透明图像的方法 6.创建平铺背景的方法 7.创建Web动画的方法 10. ...
- eclipse 汉化
对于: Eclipse Standard/SDK Version: Luna Release (4.4.0) 对应的网络地址:http://download.eclipse.org/technolog ...
- Android学习之Activity之间的数据传递
Activity与Activity之间很多情况下都需要进行数据的传递,下面就用几个简单的例子来看一下. (一).一个Activity启动另一个Activity并将数据传递到这个Activity当中 思 ...
- web开发常用样式
1.div保持底部浮动(不受滚动条影响) position:fixed;_position:absolute;bottom:0px;_bottom:0px;_margin-top:expression ...
- Ubuntu 14.10安装mentohust
关于linux下mentohust的安装本来有很多教程了,但从网上找了一些教程没有几个总结的很全面的,大都只言片语,不是太负责.下面详细的列出每一个步骤,希望能帮到有需要的人. 一 安装准备 首先下载 ...