zoukankan      html  css  js  c++  java
  • hdu Data Structure? 线段树

    线段树维护该区间有多少个数就好,计算名次时二分一下。

    #include <stdio.h>
    #define maxn 362144 
    int tree[4*maxn];
    void pushup(int o)
    {
        tree[o]=tree[o*2]+tree[o*2+1];
    }
    void build(int l,int r,int o)
    {
        if(l==r)
        {
            tree[o]=1;
            return ;
        }
        int m=(l+r)/2;
        build(l,m,o*2);
        build(m+1,r,o*2+1);
        pushup(o);
    }
    int query(int p,int l,int r,int o)
    {
        if(l==r)
        {
            tree[o]=0;
            return l;
        }
        int ans;
        int m=(l+r)/2;
        if(tree[o*2]>=p) ans=query(p,l,m,2*o);
        else ans=query(p-tree[o*2],m+1,r,2*o+1);
        pushup(o);
        return ans;
    }
    int main()
    {
        int t;
        int n,k;
        int i,x;
        int cas=0;
        scanf("%d",&t);
        while(t--)
        {
            cas++;
            scanf("%d%d",&n,&k);
            build(1,n,1);
            __int64 tot=0;
            for(i=1;i<=k;i++)
            {
                scanf("%d",&x);
                tot+=query(x,1,n,1);
            }
            printf("Case %d: %I64d
    ",cas,tot);
        }
        return 0;
    }


     

  • 相关阅读:
    【图论】第k短路
    【图论】差分约束系统
    【图论】最短路
    【图论】Johnson算法
    HDU5878
    HDU5900
    pow的小事不简单
    math汇总
    Bellman-Ford最短路径
    图的遍历
  • 原文地址:https://www.cnblogs.com/vermouth/p/3832211.html
Copyright © 2011-2022 走看看