题目链接:http://poj.org/problem?id=2299

求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法。

归并排序:

#include<cstdio>
#include<iostream>
using namespace std;
#define max 500002
int arr[max],b[max];//b[]为临时序列,arr[]为待排序数列,结果在arr[]中
int tp[max];
long long cnt=;//总逆序数
void Merge(int a[],int start,int mid,int end){
int i =start,j=mid+,k=start;
while(i<=mid&&j<=end){
if(a[i]<=a[j]){
cnt+=j-mid-;
b[k++]=a[i++];
}else{
cnt+=j-k;
b[k++]=a[j++];
}
}
while(i<=mid){
cnt+=end-mid;
b[k++]=a[i++];
}
while(j<=end){
b[k++]=a[j++];
}
for(int i=start;i<=end;i++){
a[i]=b[i];
}
}
void MergeSort(int a[], int start,int end){
if(start<end){
int mid=(start+end)/;
MergeSort(a,start,mid);
MergeSort(a,mid+,end);
Merge(a,start,mid,end);
}
}
int main(){
int n;
while(~scanf("%d",&n)&&n){
for(int i=;i<n;i++){
scanf("%d",&arr[i]);
}
cnt=;
MergeSort(arr,,n-);
printf("%I64d\n",cnt/);
}
return ;
}

  

树状数组:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
const int MAX = ;
struct data{
int id,val;
}num[MAX];
int n, C[MAX];
bool cmp(data a, data b){
return a.val>b.val;
}
void add(int i){
while(i<=n){
C[i]+=;
i+=lowbit(i);
}
}
long long sum(int i){
long long ans = ;
while(i>){
ans+=C[i];
i-=lowbit(i);
}
return ans;
} int main(){
while(scanf("%d",&n)&&n){
memset(C,,sizeof(C));
for(int i=;i<n;i++){
num[i].id=i+;
scanf("%d",&num[i].val);
}
sort(num,num+n,cmp);//离散化,将数组按降序排序,再求下标的逆序数,下标的逆序数与值逆序数相等
long long ans = ;
for(int i=;i<n;i++){
ans+=sum(num[i].id-);//求在i前面比第i个数大的数的个数
add(num[i].id);
}
printf("%I64d\n", ans);
}
return ;
}

 线段树( 以HDU1394 Minimum Inversion Number为例):

#include<iostream>
#include<cstdio>
#include<cstdlib>#include<algorithm>
const int INF = 0x3F3F3F3F;
using namespace std;
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define N 5008
int sum[N<<], a[N];
inline void pushUp(int rt){
sum[rt] = sum[rt << ] + sum[rt << | ];
} int query(int a, int b, int l, int r, int rt){
if(a <= l && b >= r){
return sum[rt];
}
int m=(l + r) >> ;
int ret=;
if(a <= m){
ret += query(a, b, lson);
}
if(b > m){
ret += query(a, b, rson);
}
return ret;
}
void update(int x, int val, int l, int r, int rt){
if(l == r){
sum[rt] = val;
}else{
int m = (l + r)/;
if(x <= m){
update(x, val, lson);
}else{
update(x, val, rson);
}
pushUp(rt);
}
} int main(){
int n;
while(~scanf("%d", &n)){
memset(sum, , sizeof(sum));
int ans = ;
for(int i = ; i < n; i++){
scanf("%d", &a[i]);
a[i]++;
ans += query(a[i] + , n, , n , );
update(a[i], , , n, );
}
int tp = ans;
for(int i = ; i < n - ; i++){
tp += n - * a[i] + ;
ans = min(ans , tp);
}
printf("%d\n",ans);
}
}

POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树的更多相关文章

  1. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  2. POJ 1195 Mobile phones (二维树状数组或线段树)

    偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...

  3. st表、树状数组与线段树 笔记与思路整理

    已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...

  4. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  5. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  6. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  7. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

  8. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

  9. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

随机推荐

  1. python对象的生命周期

    引言 碰到以下问题: 代码1: from Tkinter import * root = Tk() photo = PhotoImage(file=r'E:\workspace\python\111. ...

  2. 注册页面的js验证

    简单的用户注册页面:(html) 包含用户名格式验证.邮箱格式验证.确认密码一致性验证和必填项验证.(纯javascript) <center> <h1>用户注册</h1 ...

  3. 指针 与 数组 以及 a 与 &a的区别

      指针 与数组 并没有什么关系,   指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到;   数组 ...

  4. ios swift 2 新的OptionSetType使用方法

    http://www.rockhoppertech.com/blog/swift-2-optionsettype/?utm_source=tuicool 主要使用方法如下 components([NS ...

  5. linux下的防火墙iptables

    防火墙(firewall),也称为防护墙,是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网.它是一项信息安全的防护系统,依照特定的规则,允许或者是限制传输的数据通过. ...

  6. hibernate xx(tableName) is not mapped

    数据库中表名是:book,数据库表名不区分大小写的 之后我在hibernate 使用book, String sql="from book"; Query query=sessio ...

  7. 【Git】标签管理

    来源:廖雪峰 为什么要标签: 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本.将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来. ...

  8. mac系统下如何解压.car文件

    纯手打: 1.去github下载demo然后运行  github地址:https://github.com/steventroughtonsmith/cartool 2.找到项目下cartool的位置 ...

  9. 点击按钮出现60秒倒计时js代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. ServletConfig与ServletContext

    ServletConfig与ServletContext对象详解 一.ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个<init-param>标签为s ...