题意

给我们一个序列 序列长度小于500000 每个元素 小于999999999 让我们只移动相邻的元素
最终使得他们移动到正好上升序的最小移动次数

分析

我们看 最小的移动次数其实是个幌子
因为你移动相邻的元素 大的元素你不论如何移动
就是要一个个移动到所有比他小的元素的后面
来看原序列 9 1 0 5 4
对于9由于它是最大的 那么他就要慢慢移动到最后一个
变成 1 0 5 4 9
那么此时可以忽略9 只看前面的元素 因为9已经归位
1 0 5 4 中 5 最大 那么换到最后 变成 1 0 4 5
有效序列变成 1 0 4
注意 我们在换的过程中 有没有保证满足最小交换次数?
我们移动9 的时候 无论怎么移动 都要保证9 最后在最后一个位置上
那么无论移动后面的元素 还是移动9 都是要么把后面的元素移动到前面来
要么把9移动到后面去 其实移动9还是移动后面元素 其实都可以看成一个方向改变序列
那么在只交换相邻元素位置下的情况 其实没有最小
我们求出来交换次数 就是最小 因为他不可能跨元素移动
那么就是变成求逆序数问题了 每个元素前有几个逆序 就要移动几次
当然要离散化啦!

code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int lim = 500010;
int c[lim],a[lim];
struct node{int x,id;// value and th
}t[lim];
void add(int x,int val){while(x<lim){c[x]+=val;x+=x&(-x);}
}
ll sum(int x){ll ans = 0;while(x){ans+=c[x];x-=x&(-x); } return ans;
}
bool cmp(node a,node b){return a.x<b.x;
}
int main()
{int n;while(scanf("%d",&n),n){for(int i=1;i<=n;i++)scanf("%d",&t[i].x),t[i].id = i;sort(t+1,t+1+n,cmp);for(int i=1;i<=n;i++)a[t[i].id] = i;ll s=0;for(int i=1;i<=n;i++){add(a[i],1);s+=max(i-sum(a[i]),1ll*0);//cout<<i-sum(a[i])<<endl;          } printf("%lld\n",s); memset(c,0,sizeof(c));  }return 0;
}

如果数据中有重复元素
还可以这样离散化

        int ans = unique(t+1,t+1+n)-t-1; // 去重sort(t+1,t+1+ans);  // 排序   for(int i=1;i<=n;i++) //找排名a[i] = lower_bound(t+1,t+1+ans,a[i])-t;

POJ 2299 - Ultra-QuickSort BIT相关推荐

  1. 【逆序对】Ultra - Quicksort

    POJ 2299 Ultra-QuickSort 只允许交换,比较相邻的元素, 求最少多少次交换可以使得序列有序 冒泡排序的次数-->数列中逆序对的个数减1-->最终为0 -->答案 ...

  2. POJ 2299 Ultra-QuickSort(线段树+离散化)

    题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...

  3. poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

    题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...

  4. POJ 2299 Ultra-QuickSort(树状数组 + 离散)

    链接:http://poj.org/problem?id=2299 题意:给出N个数组成的数列A(0 <= A[i] <= 999,999,999),求该数列逆序对的数量. 分析:题目所谓 ...

  5. poj 2299 Ultra-QuickSort

    http://poj.org/problem?id=2299 归并排序 代码: #include<iostream> #include<stdio.h> #include< ...

  6. Ultra-QuickSort POJ 2299(归并排序)

    http://acm.hust.edu.cn/vjudge/contest/124435#problem/D 题意:给出一个长度为n的数列,你每一次可以随意交换其中两个数字的位置.问你至少交换几次,才 ...

  7. POJ 2299 Ultra-QuickSort(树状数组+离散化)

    题目大意: 就是说,给你一个序列,然后让你求出这个序列有多少个逆序对,所谓逆序对就是对于这个序列中的元素有a[i]>a[j] 且i<j存在. 其实原题是这样说的,给你一个序列,让你用最少的 ...

  8. POJ - 2299 Ultra-QuickSort(线段树+离散化/归并排序)

    题目链接:点击查看 题目大意:给出n个数字,求使用冒泡排序所需要交换的次数 题目分析:这个题n给到了5e5,如果直接冒泡排序的话,的时间复杂度肯定就TLE了,所以不能直接暴力模拟 我们换个思路,这个题 ...

  9. poj 2299 (归并排序)

    给定一个无序的数列,由32位整数组成的,序列长度可达500000,现在通过不断的两两交换,把这个序列排成由小到大的有序序列,问交换的次数是多少. 1 #include<stdio.h> 2 ...

最新文章

  1. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
  2. Git 高级用法小抄
  3. NKOJ 1791 Party at Hali-Bula(树状DP)
  4. 30道最常问的Java基础面试题
  5. [BUUCTF-pwn]——[BJDCTF 2nd]r2t3
  6. HTML5中本地数据库(SQLLite)的基础
  7. mysql8.0版本的服务器名称_云服务器Mysql安装配置
  8. 第二章 面向对象的编程风格
  9. iOS 11 将于9月19日正式发布,一文带你了解它的那些特性
  10. WPF、WCF、WF打造Hello World程序
  11. Echarts数据可视化echarts实例的相关操作,开发全解+完美注释
  12. 批量下载 Windows 零散系统更新的得力工具 -Windows Updates Downloader
  13. 好用的自媒体爆文素材采集技巧,提高爆文创作几率
  14. 开发imageJ插件失败经验
  15. 敬业签电脑桌面便签软件怎么绑定手机号码?
  16. VMware View中智能卡和证书身份验证
  17. html图片靠右浮动 文字左侧环绕,CSS实现模拟float: center文字左右环绕图片的效果...
  18. 百度地图缩放级别与比例尺的关系
  19. 任意长度的python列表元组_【任】 任怎么读|组词|读音|拼音|多音字|意思 - 辞海之家...
  20. Python:绘制数学图形

热门文章

  1. BZOJ 1491: [NOI2007]社交网络( floyd )
  2. 360发布穿戴设备“儿童卫士”手环
  3. Windows Mobile开发应该选择哪种开发语言?
  4. redis实践的一点思路,关于支付回调
  5. 解决$router.go(-1)返回上一层页面不刷新页面问题
  6. Android之Junit测试类
  7. css属性基础以及wxss——居中,渐变色边框,圆角边框,横向布局,重叠div,div固定在底部,input的无边框显示下划线
  8. homebrew安装mysql
  9. Oracle集合查询
  10. git clone 速度过慢