kou6839の日記

c++ 競プロ(特にcsacademy) linuxについて書きます。普段は自動車屋さんでナビ開発してます。転職先を探しています!!。

CSAcademy Subarray Partition

csacademy.com

<問題>
長さNの配列Aが与えられる。
Aを、同じ数は全て1つの連続する部分列に含まれるように分けるとき、最大でいくつに分割できるか。
(たとえば5がAの 5,9, 12番目に含まれるとすると少なくとも5~12番目を1つの部分列に含める必要がある。)


<解説>
事前にmap[ i ]でiの現れる最大のindexを指すようにmapを構築します。
i(0<=i<=N-1)を調べながら、それまで出てきた最大のmap[ i ]を持ち、
i==indexになれば(現在までの数が全て含まれている)答えを1インクリメントしていきます。

<コード>

int main() {

	int n;
	cin >> n;
	vi a(n);
	rep(i, n)cin >> a[i];

	map<int, int> m;
	rep(i, n) {
		m[a[i]] = i;
	}

	int ans = 0;

	int max_i = 0;

	rep(i, n) {
		max_i = max(max_i,m[a[i]]);
		if (i == max_i) {
			ans++;
		}
	}
	P(ans);
	return 0;
}

<感想>
問題文と公式解説(こっちは理解していない)が難しかった。