-
Notifications
You must be signed in to change notification settings - Fork 50
/
Copy path899E. Segments Removal.cpp
104 lines (82 loc) · 2.47 KB
/
899E. Segments Removal.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <bits/stdc++.h>
using namespace std;
struct node {
int id, num, siz;
node() {}
node(int id, int num, int siz) :
id(id), num(num), siz(siz) {}
bool operator<(const node &n) const {
if(n.siz != siz)
return n.siz < siz;
return n.id > id;
}
};
int const N = 2e5 + 1, INF = 1e9 + 1;
int n, a[N], id, res;
vector<node> all;
set<node> st;
map<int, pair<int, int> > nxt, prv;
set<node>::iterator cur, l, r;
int main() {
#ifndef ONLINE_JUDGE
freopen("in", "r", stdin);
#endif
scanf("%d", &n);
for(int i = 0; i < n; ++i)
scanf("%d", a + i);
for(int i = 0; i < n;) {
int j = i;
for(; j < n && a[j] == a[i]; ++j);
all.push_back(node(id++, a[i], j - i));
i = j;
}
for(int i = 0; i < (int)all.size(); ++i)
st.insert(all[i]);
for(int i = 0; i < (int)all.size() - 1; ++i)
nxt[all[i].id] = make_pair(all[i + 1].id, all[i + 1].siz);
nxt[all.back().id] = make_pair(-1, -1);
for(int i = all.size() - 1; i > 0; --i)
prv[all[i].id] = make_pair(all[i - 1].id, all[i - 1].siz);
prv[all.front().id] = make_pair(-1, -1);
res = 0;
while(!st.empty()) {
// cout << st.size() << endl;
cur = st.begin();
// cout << "CUR: " << cur->id << ' ' << cur->num << ' ' << cur->siz << endl;
// cout << prv[cur->id].first << endl;
// cout << nxt[cur->id].first << endl;
if(prv[cur->id].first != -1 && nxt[cur->id].first != -1) {
l = st.lower_bound(node(prv[cur->id].first, INF, prv[cur->id].second));
r = st.lower_bound(node(nxt[cur->id].first, INF, nxt[cur->id].second));
// cout << "L: " << l->id << ' ' << l->num << ' ' << l->siz << endl;
// cout << "R: " << r->id << ' ' << r->num << ' ' << r->siz << endl;
if(l->num == r->num) {
id = l->id;
st.insert(node(id, l->num, l->siz + r->siz));
if(prv[l->id].first != -1) {
nxt[prv[l->id].first] = make_pair(id, l->siz + r->siz);
prv[id] = prv[l->id];
} else
prv[id] = make_pair(-1, -1);
if(nxt[r->id].first != -1) {
prv[nxt[r->id].first] = make_pair(id, l->siz + r->siz);
nxt[id] = nxt[r->id];
} else
nxt[id] = make_pair(-1, -1);
st.erase(l);
st.erase(r);
} else {
nxt[l->id] = make_pair(r->id, r->siz);
prv[r->id] = make_pair(l->id, l->siz);
}
} else if(prv[cur->id].first != -1 && nxt[cur->id].first == -1) {
nxt[prv[cur->id].first] = make_pair(-1, -1);
} else if(prv[cur->id].first == -1 && nxt[cur->id].first != -1) {
prv[nxt[cur->id].first] = make_pair(-1, -1);
}
st.erase(cur);
++res;
}
printf("%d\n", res);
return 0;
}