给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的

其实就是问冒泡往后 最多多少次

但是按普通冒泡记录次数一定会超时

冒泡记录次数的本质是每个数的逆序数相加 因为只有后面的数比自己笑才能交换

但是暴力求逆序数也会超时

于是用树状数组求 从最后往前看 每次求sum相加

但是数据的范围根本开不出来树状数组...

但是由于n最多只有五十万 所以把它离散化一下 把这n个数变成1~n

技巧就是先按大小排序 然后把他们变成1~n 然后按照结构体中的顺序再排回来

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
using namespace std;
struct node
{
int zhi;
int whe;
};
int n;
int cmp(node a,node b)
{
return a.zhi<b.zhi;
}
int c[500050];
node a[500050];
int lowbit(int x)
{
return x&(-x);
}
long long sum(int x)
{
long long sum=0;
for(int i=x;i>=1;i-=lowbit(i))
{
sum+=c[i];
}
return sum;
} void add(int x)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=1;
}
}
int cmpp(node a,node b)
{
return a.whe<b.whe;
}
int main(){
while(~scanf("%d",&n))
{
if(n==0)
break;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].zhi);
a[i].whe=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
a[i].zhi=i;
}
sort(a+1,a+1+n,cmpp);
long long ans=0;
for(int i=n;i>=1;i--)
{
long long summ=sum(a[i].zhi);
add(a[i].zhi);
ans+=summ;
}
printf("%I64d\n",ans);
}
}

  

POJ 2299 树状数组+离散化求逆序对的更多相关文章

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

    In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...

  2. HDU 1394 树状数组+离散化求逆序数

    对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...

  3. CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序

    http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...

  4. POJ 3067 - Japan - [归并排序/树状数组(BIT)求逆序对]

    Time Limit: 1000MS Memory Limit: 65536K Description Japan plans to welcome the ACM ICPC World Finals ...

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

    题目链接 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm ...

  6. 树状数组||归并排序求逆序对+离散化 nlogn

    我好咸鱼. 归并排序之前写过,树状数组就是维护从后往前插入,找比现在插入的数大的数的数量. 如果值域大,可以离散化 #include <cstdio> #include <cstri ...

  7. poj 2299 树状数组求逆序对数+离散化

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 54883   Accepted: 20184 ...

  8. poj 2299 树状数组求逆序数+离散化

    http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...

  9. POJ 2299树状数组求逆序对

    求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...

随机推荐

  1. Fedora 21 install chrome

    Steps to install Google Chrome on Fedora 21 A. Create google-chrome.repo file Use this command to cr ...

  2. Secure Socket Tunneling Protocol Service服务无法启动(win7)

    第一种方法: 1.确认一下服务都开启: Base Filtering Engine IKE and Authip IPsec Keying Module Ipsec Policy Agent Wind ...

  3. linux架构图

    / 根目录 │ ├boot/ 启动文件.所有与系统启动有关的文件都保存在这里 │ └grub/ Grub引导器相关的文件 │ ├dev/ 设备文件 ├proc/ 内核与进程镜像 │ ├mnt/ 临时挂 ...

  4. cf158B(水题)

    题意:1辆出租车可以坐4人,已知k组人每组ki(ki<=4)人去坐车,要求同组人坐同一辆车,求最少需多少辆车.. 4人组的单独算,1人组和3人组一起,如1多余再将1和2匹配即可.... 代码如下 ...

  5. Java内部类的访问规则

    1.内部类可以直接访问外部类中的成员,包括私有      原因:因为在内部类中持有一个外部类的应用,格式:外部类.this class Outer {     private int x = 1; c ...

  6. 制做RPM包

    http://nmshuishui.blog.51cto.com/1850554/1583117 [root@NGM ~]# yum install pcre-devel zlib-devel ope ...

  7. Integer取值范围和NumberFormatException的解决

    项目有个查询当地新闻的接口,从GEO文件中取得code,后台查询. 下午测试的时候查询日本:3920000000,结果报java.lang.NumberFormatException,数字格式化异常, ...

  8. ubuntu下打开终端插件

    一个 nautilus 插件,用于在任意目录中打开终端 nautilus-open-terminal

  9. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  10. VB已死?还是会在Roslyn之下焕发新生?

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 由于最初的ASP.NET 5测试版并未支持VB,导致社区有一种声音:觉得VB将死.今天我们就 ...