Learning Algorithms

アルゴリズムの勉強メモ

Atcoder ARC #022 B. 細長いお菓子

Atcoder ARC #022 B. 細長いお菓子

B: 細長いお菓子 - AtCoder Regular Contest 022 | AtCoder

数列が与えられるので、その部分列の中で、相異なる数のみを含むもので最長のものの長さを答える問題。すごくシンプルなのだけれど、少し手こずった。いまどの区間の数列を見ているのかを[l, r)として、aiについて場合分けして考える。それぞれの数が出てきたときに、その数がどこに出てきたかをpに記録する。そして、そのaiが今見ている区間からはずれているか、あるいは-1で初期化されたままであれば、区間に追加する。区間に含まれているならば、そのpが示すポインタ+1の場所をlとしてから区間に追加する。以上を実装すると下のようになる。

#include "bits/stdc++.h"
using namespace std;
#define rep(i, n)             for (int (i) = 0; (i) < (int)(n); (i)++)
template<typename T, typename U> inline void amax(T &x, U y) { if (x < y) x = y; }
int in() { int x; scanf("%d", &x); return x; }

signed main() { 
        int n = in();
        vector<int> p(101010, -1);
        int l = 0, ans = -1;
        rep(r, n) {
                int a = in();
                if (p[a] < l) amax(ans, r - l + 1);
                else l = p[a] + 1;
                p[a] = r;
        }
        cout << ans << endl;
        return 0;
}