zoukankan      html  css  js  c++  java
  • BZOJ4415: [Shoi2013]发牌 树状数组+二分

    Description

     

    假设一开始,荷官拿出了一副新牌,这副牌有N张不同的牌,编号依次为1到N。由于是新牌,所以牌是按照顺序排好的,从牌库顶开始,依次为1, 2,……直到N,N号牌在牌库底。为了发完所有的牌,荷官会进行N次发牌操作,在第i次发牌之前,他会连续进行R_i次销牌操作,R_i由输入给定。请问最后玩家拿到这副牌的顺序是什么样的?

    举个例子,假设N = 4,则一开始的时候,牌库中牌的构成顺序为{1, 2, 3, 4}。

    假设R1=2,则荷官应该连销两次牌,将1和2放入牌库底,再将3发给玩家。目前牌库中的牌顺序为{4, 1, 2}。

    假设R2=0,荷官不需要销牌,直接将4发给玩家,目前牌库中的牌顺序为{1,2}。

    假设R3=3,则荷官依次销去了1, 2, 1,再将2发给了玩家。目前牌库仅剩下一张牌1。

    假设R4=2,荷官在重复销去两次1之后,还是将1发给了玩家,这是因为1是牌库中唯一的一张牌。

     

    Input

    第1行,一个整数N,表示牌的数量。第2行到第N + 1行,在第i + 1行,有一个整数R_i, 0≤R_i<N

    Output

    第1行到第N行:第i行只有一个整数,表示玩家收到的第i张牌的编号。

    Sample Input

    4
    2
    0
    3
    2

    Sample Output

    3
    4
    2
    1

    HINT

    N<=70万

    Solution

    提供一个跑的贼慢的做法

    在树状数组上二分

    复杂度$O(nlognlogn)$

    和权值线段树差不多的思路,但是好写啊

    #include <bits/stdc++.h>
    
    using namespace std ;
    
    inline int lowbit( int x ) {
        return x & -x ;
    } 
    
    #define N 700010
    
    int n ;
    int c[ N ] ;
    
    void add( int x , int val ) {
        for( int i = x ; i <= n ; i += lowbit( i ) ) 
            c[ i ] += val ;
    }
    
    int query( int x ) {
        int ans = 0 ;
        for( int i = x ; i ; i -= lowbit( i ) ) ans += c[ i ] ;
        return ans ;
    }
    
    int find( int x ) {
        int l = 1 , len = n ;
        while( len ) {
            int mid = l +( len >> 1 ) ;
            if( query( mid ) < x ) {
                l = mid + 1 ;
                len = len - ( len >> 1 | 1 ) ;
            } else len = len >> 1 ;
        }
        return l ;
    }
    
    int main() {
        int now = 0 ;
        scanf( "%d" , &n ) ;
        for( int i = 1 ; i <= n ; i ++ ) add( i , 1 ) ;
        for( int i = 1 ; i <= n ; i ++ ) {
            int t ;
            scanf( "%d" , &t ) ;
            t = t % ( n - i + 1 ) ;
            now = ( now + t ) % ( n - i + 1 ) ;
            t = find( now + 1 ) ;
            printf( "%d
    " , t ) ;
            add( t , -1 ) ;
        }
        return 0 ;
    }
  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/henry-1202/p/9745440.html
Copyright © 2011-2022 走看看