hrbust oj 1526+2028 树状数组

冒泡排序中 如果一个数的后面的某个数和这个数不符合排序规则 那么这个数就会在未来的某次冒泡中与那个数进行交换

这里用到了 树状数组求逆序数的办法来做 需要注意的是2028并不可以改完数组大小后直接套1526代码 因为会超出int的范围

树状数组求逆序对的耗时要比归并排序长一些 不过简单..

之所以要记录下来这道题是因为在其中并没有说 每一个数都是独一无二的 那么当我们离散化的时候就需要做出一些小的调整 

1526

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
int c[5050];
int n;
struct node
{
    int id;
    int val;
};
node a[5050];
int cmp1(node a,node b)
{
    return a.val<b.val;
}
int cmp2(node a,node b)
{
    return a.id<b.id;
}
void lsh(){
sort(a+1,a+1+n,cmp1);
a[0].val=0;
for(int i=1;i<=n;i++)
{
    int j=i;
    while(a[j].val==a[i].val&&j<=n)
    {
        j++;
    }
    for(int k=i;k<j;k++)
    {
        a[k].val=i;
    }
    i=j-1;
}
sort(a+1,a+1+n,cmp2);
}
int lowbit(int i)
{
    return i&(-i);
}
void add(int x)
{
    for(int i=x;i<=n;i+=lowbit(i))
    {
        c[i]+=1;
    }
}
int sum(int x)
{
    int s=0;
    for(int i=x;i>=1;i-=lowbit(i))
    {
        s+=c[i];
    }
    return s;
}
int main(){
while(cin>>n)
{
    for(int i=1;i<=n;i++)
    {
        a[i].id=i;
        cin>>a[i].val;
    }
    lsh();
    memset(c,0,sizeof(c));
    int ans=0;
    for(int i=n;i>=1;i--)
    {
        int z=sum(a[i].val-1);
        ans+=z;
        add(a[i].val);
    }
    if(ans>1000000)
        printf("xiaohouTLE!
");
    else
    {
        printf("xiaohouV5!
");
    }
}
}

2028

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<math.h>
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
long long  c[500050];
long long  n;
struct node
{
    long long  id;
    long long  val;
};
node a[500050];
long long  cmp1(node a,node b)
{
    return a.val<b.val;
}
long long  cmp2(node a,node b)
{
    return a.id<b.id;
}
void lsh(){
sort(a+1,a+1+n,cmp1);
a[0].val=0;
for(long long  i=1;i<=n;i++)
{
    long long  j=i;
    while(a[j].val==a[i].val&&j<=n)
    {
        j++;
    }
    for(long long  k=i;k<j;k++)
    {
        a[k].val=i;
    }
    i=j-1;
}
sort(a+1,a+1+n,cmp2);
}
long long  lowbit(long long  i)
{
    return i&(-i);
}
void add(long long  x)
{
    for(long long  i=x;i<=n;i+=lowbit(i))
    {
        c[i]+=1;
    }
}
long long  sum(long long  x)
{
    long long  s=0;
    for(long long  i=x;i>=1;i-=lowbit(i))
    {
        s+=c[i];
    }
    return s;
}
int main(){
while(cin>>n)
{
    if(!n)
        break;
    for(long long  i=1;i<=n;i++)
    {
        a[i].id=i;
        cin>>a[i].val;
    }
    lsh();
    memset(c,0,sizeof(c));
    long long  ans=0;
    for(long long  i=n;i>=1;i--)
    {
        long long  z=sum(a[i].val-1);
        ans+=z;
        add(a[i].val);
    }
    cout<<ans<<endl;
}
}

  

原文地址:https://www.cnblogs.com/rayrayrainrain/p/5517009.html