CF#293に参加。
まぁまぁ順調に解いていたが、Fで凡ミスして完答を逃した。
http://codeforces.com/contest/518/problem/C
問題
1~NのN個のアイコンがあるスマートフォンの画面がある。
これらのアイコンは先頭から1ページにK個ずつのっている。
アプリを1つ起動するとき、1回の操作で1つページをめくり、最後の1回の操作でアプリを起動する。
アプリを起動するとページが先頭に戻るほか、起動したアプリのアイコンが1つ前に移動する。
初期状態のボタン配置とアプリの起動順が与えられる。
ボタンの総操作回数を求めよ。
解法
アイコンの並び順および、各アプリのアイコン位置の2つのデータを保持し、順次位置に応じた操作回数を加算しつつ、手前のアイコンとの並べ替えを行っていけば良い。
int N,M,K; int but[101000]; int pos[101000]; ll ret=0; void solve() { int i,j,k,l,r,x,y; string s; cin>>N>>M>>K; FOR(i,N) { cin>>x; but[i]=x-1; pos[x-1]=i; } FOR(i,M) { cin>>x; x--; ret += pos[x]/K+1; if(pos[x]>0) { y=but[pos[x]-1]; swap(but[pos[x]],but[pos[x]-1]); pos[y]++; pos[x]--; } } cout<<ret<<endl; }
まとめ
本番、配列の添え字を間違えて2WAしてしまった。