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次变换得到的数列其中的 ...
随机推荐
- 《Learn python the hard way》Exercise 48: Advanced User Input
这几天有点时间,想学点Python基础,今天看到了<learn python the hard way>的 Ex48,这篇文章主要记录一些工具的安装,以及scan 函数的实现. 首先与Ex ...
- 原生sql语句执行
public function Text() { $nation = D("Nation"); $sqla = "select * from nation"; ...
- 集成Dubbo服务(Spring)
Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...
- html5+css3中的background: -moz-linear-gradient 用法 (转载)
转载至-->http://www.cnblogs.com/smile-ls/archive/2013/06/03/3115599.html 在CSS中background: -moz-linea ...
- 利用dedecms给近三天(或当天)发布的文章显示红色日期或加上new字或new小图片
1)红色日期 <br>[field:pubdate runphp='yes'] <br>$a="<font color=red>".strfti ...
- 关于背景透明,文字不透明的最佳方法,兼容IE
以背景黑色,透明度0.5举例 非IE:background:rgba(0,0,0,0.5); IE:filter:progid:DXImageTransform.Microsoft.gradient( ...
- Eclipse+Java+OpenCV246人脸识别
1.环境搭建:见上一篇博客 整个项目的结构图: 2.编写DetectFaceDemo.java,代码如下: package com.njupt.zhb.test; import org.opencv. ...
- python网络编程之socket
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- (转).net程序员转战android第一篇---环境部署
原文,整个序列一样http://www.cnblogs.com/Twmin/p/3148892.html 对于.net开发人员去写java,可谓说是见山是山, 因为太多的相同; 最近段时间因工作因素, ...
- Jquery:jquery中的DOM操作<一>
之前两天学习了Jquery强大的选择器,今天学习了一部分Jquery对DOM的操作,下面我将把自己今天的成果分享给大家,那些菜鸟们,你们是否需要巩固之前所学? 首先需要知道,DOM操作分为3个方面:D ...