【题目大意】

给出0..n-1组成的一段数,可以移动前几个数到结尾。求出最小的逆序对个数。

【思路】

先用线段树求出逆序对,方法和树状数组是一样的。然后对于当前第一个数num[0],在它之后比它小的数有num[0],则它移动到末位之后减小的逆序对是num[0],增加的是n-1-num[0]。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define lson l,m,root<<1
#define rson m+1,r,root<<1|1
const int MAXN=+;
int n,num[MAXN];
int sum[MAXN*];
int inver[MAXN]; void pushUP(int root)
{
sum[root]=sum[root<<]+sum[root<<|];
} void build(int l,int r,int root)
{
if (l==r)
{
sum[root]=;
return;
}
int m=(l+r)>>;
build(lson);
build(rson);
pushUP(root);
} void update(int p,int delta,int l,int r,int root)
{
if (l==r)
{
sum[root]+=delta;
return;
}
int m=(l+r)>>;
if (p<=m) update(p,delta,lson);
if (p>m) update(p,delta,rson);
pushUP(root);
} int query(int L,int R,int l,int r,int root)
{
if (L<=l && r<=R)
{
return sum[root];
}
int m=(l+r)>>,res=;
if (L<=m) res+=query(L,R,lson);
if (R>m) res+=query(L,R,rson);
return res; } int main()
{
while (scanf("%d",&n)!=EOF)
{
build(,n-,);
for (int i=;i<n;i++)
{
scanf("%d",&num[i]);
inver[i]=query(num[i]+,n,,n,);
update(num[i]+,,,n,);
}
int tempsum=;
for (int i=;i<n;i++) tempsum+=inver[i];
int ans=tempsum;
for (int i=;i<n;i++)
{
tempsum-=num[i];
tempsum+=n--num[i];
ans=min(ans,tempsum);
}
cout<<ans<<endl;
}
return ;
}

最新文章

  1. the operation was attempted on an empty geometry Arcgis Project异常
  2. 破解加密PDF文件pdfcrack
  3. Android jar包的导出和使用
  4. The main difference between Java &amp; C++(转载)
  5. freebsd 显示中文
  6. [转]通过PowerShell工具跨多台服务器执行SQL脚本
  7. angularjs 相关资料
  8. 什么是Ajax无刷新技术?
  9. Java获取最后插入MySQL记录的自增ID值方法
  10. POJ 3422 Kaka&#39;s Matrix Travels(最小费用最大流)
  11. oracle中exp,imp的使用详解
  12. python网上开发执行环境
  13. PAT (Advanced Level) 1020. Tree Traversals (25)
  14. PC-lint集成于SourceInsight 范例以及简单分析;提高代码的健壮性;
  15. 数据标记系列——图像分割 &amp; PolygonRNN++(一)
  16. kubernetes1.4新特性(一):支持sysctl命令
  17. Cotex-M4简介
  18. Linux系统下tomcat的配置
  19. OOP ⑴
  20. js中toFixed() 的使用(转)

热门文章

  1. 在电脑中配置adb
  2. 【bzoj3786】星系探索
  3. swift 动态获取类, 获取命名空间
  4. 【总结】IE和Firefox的Javascript兼容性总结
  5. iframe子页面获取父页面元素和window对象
  6. Mysql 数据库学习笔记02 编程
  7. jdbc连接远程数据库进行操作
  8. 19:django 分页
  9. hdu 1026(优先队列+路径输出)
  10. Delphi使程序的窗口出现在最前面并激活