【题目链接】
【思路要点】
- 平衡树/ std::set/multiset s t d :: s e t / m u l t i s e t 模板题。
- 时间复杂度 O(NLogN) O ( N L o g N ) 。
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXN 5005
template <typename T> void read(T &x) {
x = 0; int f = 1;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
x *= f;
}
int mode, n;
multiset <int> a;
multiset <int> :: iterator tmp, tnp;
int main() {
read(n); mode = 0;
long long ans = 0;
for (int i = 1; i <= n; i++) {
int opt, value;
read(opt), read(value);
if (opt == 0) {
if (mode == 0) a.insert(value);
else if (a.size() == 0) {
mode = 0;
a.insert(value);
} else {
tmp = a.lower_bound(value);
if (tmp == a.end()) tmp--;
else if (tmp != a.begin()) {
tnp = tmp; tnp--;
if (abs(*tnp - value) <= abs(*tmp - value)) tmp = tnp;
}
ans += abs(value - *tmp);
a.erase(tmp);
}
} else {
if (mode == 1) a.insert(value);
else if (a.size() == 0) {
mode = 1;
a.insert(value);
} else {
tmp = a.lower_bound(value);
if (tmp == a.end()) tmp--;
else if (tmp != a.begin()) {
tnp = tmp; tnp--;
if (abs(*tnp - value) <= abs(*tmp - value)) tmp = tnp;
}
ans += abs(value - *tmp);
a.erase(tmp);
}
}
}
cout << ans % 1000000 << endl;
return 0;
}