#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);
//思路1
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;
}
//思路2
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]);
//思路3
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;
}
Codeforces Round #768 (Div. 2) E. Paint the Middle
E. Paint the Middle#include <bits/stdc++.h>using namespace std;#define FI first#define SE second#define MP make_pair#define PB push_backtypedef pair<int, int> PII;const int N = 2e5 + 10;PII pos[N];vector<PII> seg;vector<PII&