hrbust oj 1526+2028 树状数组

Posted 天翎月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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!\n");
    else
    {
        printf("xiaohouV5!\n");
    }
}
}

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;
}
}

  

 

以上是关于hrbust oj 1526+2028 树状数组的主要内容,如果未能解决你的问题,请参考以下文章

hrbust oj 1025 (计算几何+近似计算)

FZU oj 2277 Change 树状数组+dfs序

uestc oj 1217 The Battle of Chibi (dp + 离散化 + 树状数组)

玲珑学院OJ 1023 - Magic boy Bi Luo with his excited math problem 树状数组暴力

[模板]树状数组

Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) C. Fountains 树状数组维护区间最大值(示(代