点我看题目

题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆序数。

思路 :用线段树就是查找比当前这个数大的已存入线段树中的个数。比如求a[i],那么就查找当前线段树(a[i]+1,n)中的个数。。然后把a[i]更新到线段树中。。求逆序数的时候法,当把x放入数组的后面,此时的逆序数应该为x没放入最后面之前的逆序总数加上(n-x)再减去(x-1);sum = sum+(n-x[i])-(x[i]-1)。

这个破题让我很晕的地方,一开始我没注意的是,输入的数据大小是从0到n的范围之内的,所以我还把数据跟下标弄混了来着。。。。

//HDU 1394
#include <stdio.h>
#include <string.h>
#include <iostream> using namespace std ; const int maxn = ; struct node
{
int l,r ;
int num,value ;
} Node[maxn*] ;
int data[maxn] ; void build(int v,int l,int r )
{
Node[v].l = l ;
Node[v].r = r ;
Node[v].value = ;
int mid = (l + r) >> ;
if(l == r) return ;
build(v*,l,mid) ;
build(v*+,mid+,r) ;
} void update(int v,int l,int r)
{
if(Node[v].l == l&& Node[v].r == r)
{
Node[v].value ++ ;
return ;
} int mid = (Node[v].l + Node[v].r) >> ;
if(l <= mid) update(v*,l,r) ;//因为是单点更新,不需要段,所以也没有横跨两个区间
else update(v*+,l,r) ;
Node[v].value = Node[v*].value+Node[v*+].value ;
} int query(int v,int l,int r)
{
if(Node[v].l == l && Node[v].r == r)
{
return Node[v].value ;
}
int mid = (Node[v].l+Node[v].r) >> ;
if(r <= mid)
return query(v*,l,r) ;
else if(l > mid) return query(v*+,l,r) ;
else
return query(v*,l,mid)+query(v*+,mid+,r) ;
}
int main()
{
int n ;
while(~scanf("%d",&n))
{
build(,,n) ;
int sum = ;
for(int i = ; i <= n ; i++)
{
scanf("%d",&data[i]) ;
data[i]++ ;//题目中的是从0到n-1,而建树是从1开始建的,所以这里要往右偏移一个
update(,data[i],data[i]) ;
if(data[i] + <= n)
sum += query(,data[i]+,n) ;//这里+1是因为如果你要找5的逆序数,得从6开始找。
}
int minn = ;
for(int i = ; i <= n- ; i++)
{
sum += ((n-data[i])-(data[i]-)) ;
if(minn > sum)
minn = sum ;
}
printf("%d\n",minn) ;
}
return ;
}

最新文章

  1. [BZOJ1579][Usaco2009 Feb]Revamping Trails 道路升级(二维最短路问题)
  2. (转)listview中常见难题总结
  3. 测试分页查询出数据并分文件导出[java工程]
  4. .NET笔试题(关于迭代的:遍历XML中的FileName)
  5. Swift - 26 - 函数的基础写法
  6. hdu3811(状态压缩dp)
  7. [jstips]向数组中插入一个元素
  8. CSS——盒模型
  9. Tornado介绍及自定义组件
  10. Hexo之傻瓜攻略
  11. mac 开发环境安装
  12. Apache和Nginx的区别
  13. docker项目ssl 安全证书的种种
  14. iis7.5 配置伪静态
  15. vue-用Vue-cli从零开始搭建一个Vue项目
  16. django--用户认证组件
  17. Python中fileinput模块使用方法
  18. SVG.js 颜色渐变使用
  19. C++ 转型动作 尽量避免 以及 那些意想不到的威胁
  20. Docker 拷贝文件

热门文章

  1. 删除sd卡的文件
  2. pcap支持Python2.7.8解决办法
  3. php中的全局变量引用
  4. 如何恢复oracle中已删除的表
  5. Parameters
  6. nginx 限制及指定IP或IP段访问
  7. mysql主从之主键冲突
  8. 网站开发常用jQuery插件总结(十)菜单插件superfish
  9. 转:android中APK开机自动运行
  10. firefox下对ajax的onreadystatechange的支持情况分析及解决