DISCO presents ディスカバリーチャンネル Programming Contest 2016 Qualification B - ディスコ社内ツアー

,

制約を、各周に関してその周のなかで面白さ$A_i$が広義単調、と誤読してlisを書いていた。これが無ければC通っていた可能性がある。

B - ディスコ社内ツアー

解法

貪欲 + 二分探索。

実装

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
typedef long long ll;
using namespace std;
int main() {
    int n; cin >> n;
    vector<int> a(n); repeat (i,n) cin >> a[i];
    map<int,vector<int> > cnt; // ordered map
    repeat (i,n) cnt[a[i]].push_back(i);
    int ans = 0;
    int x = 0;
    for (auto && it : cnt) {
        vector<int> & xs = it.second;
        sort(xs.begin(), xs.end());
        if (x <= xs.front()) {
            x = xs.back();
        } else {
            auto it = lower_bound(xs.begin(), xs.end(), x);
            x = *(-- it);
            ++ ans;
        }
    }
    if (x != 0) ++ ans;
    cout << ans << endl;
    return 0;
}