U - 順列CodeForcesを取得 - 1294E

ソリューション:

各列と、各列の間には相互作用は、貪欲での最小動作値を決定せず、その後加算しないことに留意されたいです。

どのように最小にそれを求めるのですか?ホーミングI jの要素を持つ、そこ我々はそれらを変更する必要がので、ビットニュージャージー州ノーリターンならない合計NJ時間を変更するので、Nの合計であろう[I] = jの時間をロールアップシーケンスを表したのと同じ配列と同じ表現を維持します-j + I回。

したがって、分の各列に対する答え(N-同じ[I] + i)は、発見するための方法で同じ。まず、各列の要素の範囲がj <[I] = ARR [J] <= N * Mであり、[I] [J]%のM == j個の%のM、すなわち、各列のM個の要素値をARR値が等しくなければなりません。リストの要素は唯一の方法です。

対価の条件を満たしていない人のために。そのため何回ロールオーバーに関係なく、所定の場所にそれを作ることができません。条件を満足するために、次に目標が位置POSであり、現在位置jを仮定し(J-POS + N)%Nへの答えが、反転の回数です。POS値:(ARR [I] [J] -j)/ M + 1。

同じことが、そう[(J-POS + N)%N] ++;

コード:

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
typedefの長い 長いLL。
CONST N = 2E5 + LL 7 
ベクター <LL> VEの[N]。
同じLL [N]。// 元素I向上移动同じ[J]个可以恢复
INT メイン()
{ 
    LL N、M。
    CIN >> N >> M。
    LL C = N * M。
    LL Y。
    以下のための(iは= LL 1、I <= C; I ++ ){ 
        CIN >> yと;
        もし(I%M == 0 ){ 
            .push_back(Y)[m]をまし。
        }
         VEの[I%のM] .push_back(Y)。
    } 
    LL和 = 0 以下のために(LL iは= 1 ; iが<= M; iは++ ){ 
        LL C =は、VEの[I] .size()。
        (LL J = 0 ; J <C; J ++ ){
             場合([J] <iは|| [I] VEの[J]> N * M [i]がVE)続けますもし(VEの[I] [J]%のM == I%のM){ 
                LL POS =(VEの[I] [J] -i)/ M + 1 
                LL K =(J + 1 -pos + N)%N。
                同じ[K] ++  ; }
        }
        LL CNT = N。
        (LL J = 0 ; J <nであり、j ++ ){ 
            CNT =分(CNT、J + N- 同じ[J])。
            同じ[J] = 0 ; 
        }  + = CNT。
    } 
    COUT <<和<< ENDL。
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/Accepting/p/12238997.html