HDU 1394 Minimum Inversion Number【 树状数组 】
2024-08-31 10:42:53
题意:给出n个数,每次可以把第一个数挪到最后一个位置去,问这n种排列里面的最小逆序对数
先把最开始的逆序对数求出来
然后对于一个数a[i],比它小的数有a[i] - 1个,比它大的数有n - a[i]个
所以把a[i]挪到数列的最末尾的时候, 相当于损失了a[i] - 1个逆序数,得到了n - a[i] 个逆序数
即为共得到n - 2*a[i] + 1个
再做n次比较,维护一个最小值
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; int n;
int a[maxn],c[maxn]; int lowbit(int x){ return x &(-x);} int sum(int x){
int ret =;
while(x>){
ret+=c[x];x-=lowbit(x);
}
return ret;
} void add(int x,int d){
while(x<=n){
c[x]+=d;x+=lowbit(x);
}
} int main(){
while(scanf("%d",&n) != EOF){
memset(c,,sizeof(c));
for(int i=;i<=n;i++) scanf("%d",&a[i]),a[i]++; int ans=;
for(int i=;i<=n;i++){
ans += i - -sum(a[i]);
// printf("ans=%d\n",ans);
add(a[i],);
}
int minn=INF;
for(int i=;i<=n;i++){
ans += n-*a[i] + ;
minn=min(minn,ans);
}
printf("%d\n",minn);
}
return ;
}
最新文章
- [deviceone开发]-直播APP心形点赞动画示例
- 我的Android第一章:Android环境搭建
- [Shell]正则表达式与通配符
- ubuntu apache2 wsgi 部署django
- bzoj 3295 树套树
- HDU1963Investment(DP)
- HTML与CSS简单页面效果实例
- PHP MySQL Order By 关键词 之 Order By
- 用DapperExtensions和反射来实现一个通用搜索
- Android WebView 不支持 H5 input type=";file"; 解决方法
- ESL翻译:Linear Methods for Regression
- angularjs中的几种工具方法
- Restful中 @RequestParam,@PathParam,@PathVariable等注解区别
- 随手一记,maven打包
- css_选择器
- Handle/Looper源码分析;
- Suse linux enterprise 11添加设置中文输入法的方法
- NodeJs递归删除非空文件夹
- 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading
- 二、K3 WISE 开发插件《 工业单据老单客户端插件事件、属性、方法》
热门文章
- 在APP开发设计中,为什么APP开发公司要慎用左右横滑设计?
- 自己写的PHP的mql类
- Apache2.2伪静态配置
- shell-6.环境变量配置文件
- IOS - PDF合并
- ajax异步请求获取数据,实现滚动数字的效果。
- linux内核(二)内核移植(DM365-DM368开发攻略——linux-2.6.32的移植)
- Windows里正确安装Zookeeper以服务运行
- HDU 4333 Contest 4
- [Python Test] Use pytest fixtures to reduce duplicated code across unit tests