0
点赞
收藏
分享

微信扫一扫

Codeforces Round #768 (Div. 2) E. Paint the Middle

登高且赋 2022-02-04 阅读 82
算法

E. Paint the Middle

#include <bits/stdc++.h>
using namespace std;
#define FI first
#define SE second
#define MP make_pair
#define PB push_back
typedef pair<int, int> PII;
const int N = 2e5 + 10;
PII pos[N];
vector<PII> seg;
vector<PII> res;
int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) {
        int a;
        scanf("%d", &a);
        if (pos[a].FI == 0) pos[a].FI = i;
        else pos[a].SE = i;
    }
    for (int i = 1; i <= n; i ++ ) 
        if (pos[i].FI && pos[i].SE)
            seg.PB(MP(pos[i].FI, pos[i].SE));
    if (seg.empty()) {
        puts("0");
        return 0;
    }
    sort(seg.begin(), seg.end());
    res.PB(seg[0]);
    int now = 0, ed = res[0].SE, flag = -1;
    for (int i = 1; i < seg.size(); i ++ ) {
        while (i < seg.size() && seg[i].FI < seg[now].SE) {
            if (seg[i].SE > ed) {
                ed = seg[i].SE;
                flag = i;
            }
            i ++;
        }
        if (i >= seg.size()) break;
        if (flag != -1) {
            res.PB(seg[flag]);
            now = flag;
            ed = seg[flag].SE;
            flag = -1;
            i --;
        } else {
            res.PB(seg[i]);
            ed = seg[i].SE;
            now = i;
        }
    }
    if (flag != -1) res.PB(seg[flag]);
    int ans = 0, cnt = 0, st = res[0].FI;
    ed = res[0].SE;
    for (int i = 1; i < res.size(); i ++ ) {
        if (res[i].FI < ed) {
            ed = max(res[i].SE, ed);
            cnt ++;
        } else {
            ans += ed - st - cnt - 1;
            st = res[i].FI;
            ed = res[i].SE;
            cnt = 0;
        }
    }
    ans += ed - st - cnt - 1;
    cout << ans << endl;
    return 0;
}
举报

相关推荐

0 条评论