ソリューション:
各列と、各列の間には相互作用は、貪欲での最小動作値を決定せず、その後加算しないことに留意されたいです。
どのように最小にそれを求めるのですか?ホーミング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 ; }