zoukankan      html  css  js  c++  java
  • 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;
    }
    }
    

      

  • 相关阅读:
    从迷宫终点出发——Leo鉴书36
    OCP-1Z0-053-V13.02-238题
    OCP-1Z0-053-V13.02-233题
    OCP-1Z0-053-V13.02-232题
    OCP-1Z0-053-V13.02-228题
    OCP-1Z0-053-V13.02-226题
    OCP-1Z0-053-V13.02-225题
    OCP-1Z0-053-V13.02-221题
    OCP-1Z0-053-V13.02-219题
    OCP-1Z0-053-V13.02-216题
  • 原文地址:https://www.cnblogs.com/rayrayrainrain/p/5517009.html
Copyright © 2011-2022 走看看