zoukankan      html  css  js  c++  java
  • POJ 2182 Lost Cows

    POJ_2182

        没想到线段树也可以这么用,确实线段树太灵活了……

        这个题目可以转化成从后向前依次查询,比如当前奶牛的前面有x个号码比它小的奶牛,那么它就应该在剩余的数的序列中排第x+1。因此,我们可以维护一个线段树,节点值表示当前区间内还有多少个数,当寻找第x+1大的数时,可以自顶向下查找,找到之后删去这个数,即自底向上更新一遍节点的值即可。

    #include<stdio.h>
    #include<string.h>
    #define MAXD 8010
    int tree[4 * MAXD], N, M, q[MAXD];
    void init()
    {
    int i, j;
    memset(tree, 0, sizeof(tree));
    for(M = 1; M < N + 2; M <<= 1);
    for(i = 0, j = M + 1; i < N; i ++, j ++)
    tree[j] = 1;
    for(i = M - 1; i; i --)
    tree[i] = tree[2 * i] + tree[2 * i ^ 1];
    }
    void solve()
    {
    int i, j, k;
    q[0] = 0;
    for(i = 1; i < N; i ++)
    scanf("%d", &q[i]);
    for(i = N - 1; i >= 0; i --)
    {
    k = q[i] + 1;
    for(j = 1; j < M;)
    {
    if(tree[2 * j] >= k)
    j <<= 1;
    else
    {
    k -= tree[2 * j];
    j = (j << 1) + 1;
    }
    }
    q[i] = j - M;
    while(j ^ 1)
    {
    tree[j] --;
    j >>= 1;
    }
    }
    for(i = 0; i < N; i ++)
    printf("%d\n", q[i]);
    }
    int main()
    {
    while(scanf("%d", &N) == 1)
    {
    init();
    solve();
    }
    return 0;
    }


  • 相关阅读:
    Java代码是怎么运行的
    Java单例模式
    redis分布式锁实现
    zuul2.0
    配置ssh免密钥登陆多台从机
    Nifi-install-config
    Configure Access to Multiple Clusters
    kubernetes集群搭建(kubeadm,kubelet)
    shell 编程
    系统管理
  • 原文地址:https://www.cnblogs.com/staginner/p/2226650.html
Copyright © 2011-2022 走看看