HDU 1394 Minimum Inversion Number(求最小逆序数)
来源:互联网 发布:win7禁止安装任何软件 编辑:程序博客网 时间:2024/05/24 06:10
大意:
给出0~n-1的n个数的一种排列,并且可以将第一个数字移动到最后一个形成新的排列,求这些排列的逆序数(满足i<j,ai>aj的数对)的最小值。
思路:
求出原排列的逆序数a之后,下一个排列的逆序数值b应该符合b=a-inp[i](移动的数字值)+n-inp[i]-1;
因为inp[i]为第一个元素时,后面必有inp[i]个比它小的数,所以减少了inp[i]个对数,而移动到最后一个的同时增加了n-inp[i]-1个逆序对数。
至于求原排列的逆序数的方法有很多,线段树,树状数组,归并排序甚至暴力(汗..)。
给出的代码使用的是线段树的做法,先建立一个全为0的树,每次输入查询inp[i]~n-1出现了多少个(其和即为所求原排列逆序数),并且标记inp[i]已出现。
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;const int N=5000+5;struct tree{ int a[N<<2]; void push(int cur) { a[cur]=a[cur<<1]+a[cur<<1|1]; } void build(int nod,int l,int r) { a[nod]=0; if(l==r) { return; } int mid=(l+r)>>1; build(nod<<1,l,mid); build(nod<<1|1,mid+1,r); push(nod); } void update(int n,int l,int r,int cur) { if(l==r) { a[cur]++; return; } int mid=(l+r)>>1; if(n<=mid) update(n,l,mid,2*cur); else update(n,mid+1,r,2*cur+1); push(cur); } int query(int c,int b,int l,int r,int cur) { if(c<=l&&b>=r) return a[cur]; int mid=(l+r)>>1; int ans=0; if(c<=mid) { ans+=query(c,b,l,mid,2*cur); } if(b>mid) { ans+=query(c,b,mid+1,r,2*cur+1); } return ans; }}si;int main(){ int n; int inp[N]; while(scanf("%d",&n)==1) { int cnt=0; si.build(1,0,n-1); for(int i=0;i<n;i++) { scanf("%d",&inp[i]); cnt+=si.query(inp[i],n-1,0,n-1,1); si.update(inp[i],0,n-1,1); } int ans=cnt; //cout<<ans<<endl; for(int i=0;i<n;i++) { cnt+=n-2*inp[i]-1; if(cnt<ans) ans=cnt; } printf("%d\n",ans); } return 0;}
0 0
- HDU 1394 Minimum Inversion Number(求最小逆序数)
- HDU-1394-Minimum Inversion Number(最小逆序数-模拟)
- HDU 1394 Minimum Inversion Number (求逆序数)
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
- HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)
- HDU 1394 Minimum Inversion Number (线段树+最小逆序数)
- HDU 1394 Minimum Inversion Number 最小逆序数 线段树
- hdu 1394 Minimum Inversion Number 最小逆序数
- hdu 1394 Minimum Inversion Number 线段树求最小逆序数
- hdu 1394 Minimum Inversion Number(线段树求最小逆序数)
- HDU 1394 Minimum Inversion Number 线段树求最小逆序数
- hdu 1394 Minimum Inversion Number(线段树求最小逆序数)
- HDU 1394 Minimum Inversion Number 线段树求逆序数
- hdu 1394 Minimum Inversion Number 线段树求逆序数
- 线段树求逆序数 hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number【线段树求逆序数】
- hdu 1394 Minimum Inversion Number 归并求逆序数
- HDU 1394- Minimum Inversion Number(线段树求逆序数)
- UICollectionView详解
- poj 3667 Hotel(线段树区间更新)
- phpMyAdmin出现Fatal error: Call to undefined function __() in ..../core.lib.php on line 229解决办法
- 一个spark receiver 或多个spark receiver 接收 多个flume agent
- python 中的字典
- HDU 1394 Minimum Inversion Number(求最小逆序数)
- Swift学习笔记(二十一)——字典
- -bash: php: command not found 命令找不到
- Android PullToRefresh 使用详解
- 使用AutoSuggest Behavior实现自动提示功能
- 逻辑回归笔记
- C++ 锁,socket死锁
- iOS提交后申请加急审核
- hdoj3787 A+B