kmjp's blog

競技プログラミング参加記です

Codeforces #293 Div2 C. Anya and Smartphone

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してしまった。