hdu 1394 线段树求逆序数
2015-06-01 08:40
197 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1394
#include <cstdio> using namespace std; const int maxx=5100; int sum[maxx<<2]; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 void pushup(int rt) { sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void build(int l, int r, int rt) { sum[rt]=0; if(l==r) return; int m = (l+r)>>1; build(lson); build(rson); } void update(int p, int l,int r, int rt) { if(l==r) { sum[rt]++; return; } int m = (l+r)>>1; if(p<=m) update(p,lson); else update(p,rson); pushup(rt); } int query(int L, int R, int l, int r, int rt) { if(L<=l&&r<=R) return sum[rt]; int m = (l+r)>>1; int res=0; if(L<=m) res+=query(L,R,lson); if(R>m) res+=query(L,R,rson); return res; } int a[maxx]; int main() { int n; while(~scanf("%d",&n)) { build(0,n-1,1); int sum=0; for(int i = 0; i<n; i++) { scanf("%d",&a[i]); sum+=query(a[i],n-1,0,n-1,1); update(a[i],0,n-1,1); } int res=sum; for(int i = 0; i<n; i++) { sum+=n-a[i]-a[i]-1; res=res<sum?res:sum; } printf("%d\n",res); } }
相关文章推荐
- Linux 的多线程编程的高效开发经验
- 支持php短格式
- js实现网页新消息标题闪烁提醒
- git分支管理策略
- JS实现HTML静态页传值的方法
- 20个Linux防火墙应用技巧
- 连接池详解
- 连接池详解
- 如何在Fedora或CentOS上使用Samba共享文件夹
- 查看当前系统shell
- 查看当前系统shell 分类: Ubuntu学习笔记 2015-06-01 08:34 28人阅读 评论(0) 收藏
- Java NIO 06=====Selector
- NOI 2006 题解
- Visual Studio Xaml编辑器不能识别引入的外来库,程序却能成功运行
- JTable的常见用法
- jQuery 获取、设置表单元素的值
- java Swing实现右键复制粘贴
- latex中如何引用公式
- 广州本田整车销售管理系统技术分析(三)
- RabbitMQ 入门指南(Java)