POJ 2299 树状数组+离散化求逆序对
给出一个序列 相邻的两个数可以进行交换 问最少交换多少次可以让他变成递增序列 每个数都是独一无二的
其实就是问冒泡往后 最多多少次
但是按普通冒泡记录次数一定会超时
冒泡记录次数的本质是每个数的逆序数相加 因为只有后面的数比自己笑才能交换
但是暴力求逆序数也会超时
于是用树状数组求 从最后往前看 每次求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 树状数组+离散化求逆序对的更多相关文章
- POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a seque ...
- HDU 1394 树状数组+离散化求逆序数
对于求逆序数问题,学会去利用树状数组进行转换求解方式,是很必要的. 一般来说我们求解逆序数,是在给定一串序列里,用循环的方式找到每一个数之前有多少个比它大的数,算法的时间复杂度为o(n2). 那么我们 ...
- CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序
http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...
- POJ 3067 - Japan - [归并排序/树状数组(BIT)求逆序对]
Time Limit: 1000MS Memory Limit: 65536K Description Japan plans to welcome the ACM ICPC World Finals ...
- Ultra-QuickSort (POJ 2299)树状数组+离散化
题目链接 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm ...
- 树状数组||归并排序求逆序对+离散化 nlogn
我好咸鱼. 归并排序之前写过,树状数组就是维护从后往前插入,找比现在插入的数大的数的数量. 如果值域大,可以离散化 #include <cstdio> #include <cstri ...
- poj 2299 树状数组求逆序对数+离散化
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 54883 Accepted: 20184 ...
- poj 2299 树状数组求逆序数+离散化
http://poj.org/problem?id=2299 最初做离散化的时候没太确定可是写完发现对的---由于后缀数组学的时候,,这样的思维习惯了吧 1.初始化as[i]=i:对as数组依照num ...
- POJ 2299树状数组求逆序对
求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...
随机推荐
- Win8 Cisco VPN Client 442错误解决办法
进入注册表regedit,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CVirtA找到DisplayName, x86系统的将值" ...
- Linux多台服务器之间的文件共享
由于项目有个图片上传和导入导出的模块,所以当项目通过集群方式部署的时候就要考虑文件共享问题. 文件共享要么就是通过统一的文件系统来管理,要么就是在系统之间做文件共享,前者扩展性比较好,可以随时随地加服 ...
- 脚踏实地学C#2-引用类型和值类型
引用类型和值类型介绍 CLR支持两种类型,引用类型和值类型两种基本的类型: 值类型下有int.double.枚举等类型同时也可以称为结构,如int结构类型.double结构类型,所有的值类型都是隐式密 ...
- mac平台下面nodejs环境搭配
方法一(pkg方式:下载链接http://nodejs.org/dist/v0.12.4/node-v0.12.4.pkg): 官网:https://nodejs.org/download/ 例子: ...
- 在Windows中使用MinGW编译X264
转自:http://www.cnblogs.com/xiongjiaji/archive/2012/06/08/2541265.html 参考:http://ayobamiadewole.com/Bl ...
- ER-STUDIO 6.5工具使用帮助的中文翻译
转自于:http://yujingwang.blog.sohu.com/63362979.html 1 资料 ER-STUDIO的帮助(英文) 2 内容 2.1 ...
- GridView实现一个图片加多个文本框
GridView的使用是很简单的,API Demo中有例子,但是要实现复杂的GridView,就需要自定义了. 今天我们要实现如下的效果: 先说它的布局,它是由gridview和grid_item两部 ...
- Hark的数据结构与算法练习之插入排序
算法说明: 先是拿语言进行一下描述: 假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替). 然 ...
- 递推DP URAL 1586 Threeprime Numbers
题目传送门 /* 题意:n位数字,任意连续的三位数字组成的数字是素数,这样的n位数有多少个 最优子结构:考虑3位数的数字,可以枚举出来,第4位是和第3位,第2位组成的数字判断是否是素数 所以,dp[i ...
- MBR 基础
1.简介 MBR,全称为Master Boot Record,即硬盘的主引导记录,它位于整个硬盘的0磁道0柱面1扇区,其主要对硬盘进行了组织,是在驱动器最前端的一段引导扇区. MBR是不属于任何一个操 ...