Codeforces Round #137 (Div. 2) A : Shooshuns and Sequence

問題概要

長さN(<10^5)の数列がある。

  • k番目の要素を末尾に追加する。
  • 先頭の要素を消す。

を何回繰り返したら全てが同じ要素になるか求める問題。同じにならないなら指摘する。

解法

dequeを使ってシミュレーションする。収束するとしたら高々Nくらいなのでその程度回して無理なら-1を返せばよい。ちゃんと調べてシミュレーション以外の方法で求めることもできる。

acceptされたコード

#include <cstdio>
#include <deque>
#include <map>
using namespace std;

const int MAX_N = int(1e5);
int N, K;
int as[MAX_N];

void init() {
	scanf("%d%d", &N, &K);
	--K;
	for (int i = 0; i < N; ++i) {
		scanf("%d", as + i);
	}
}

int solve() {
	map<int,int> freq;
	for (int i = 0; i < N; ++i) {
		++freq[as[i]];
	}

	deque<int> deq(as, as+N);
	for (int i = 0; i < 3*N; ++i) {
		if (freq[deq[0]] == N) {
			return i;
		}
		--freq[deq[0]];
		++freq[deq[K]];
		deq.push_back(deq[K]);
		deq.pop_front();
	}
	return -1;
}

int main() {
	init();
	printf("%d\n", solve());
	return 0;
}