-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathCoordinate Compression.cpp
More file actions
44 lines (38 loc) · 1018 Bytes
/
Coordinate Compression.cpp
File metadata and controls
44 lines (38 loc) · 1018 Bytes
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
// Coordinate Compression
//
template <typename T>
struct CoordinateCompression {
int n;
vector<int> compressed;
vector<T> original;
CoordinateCompression(const vector<T> &vec) {
n = vec.size();
original = vec;
compressed.assign(n, 0);
vector<pair<T, int>> pairs(n);
for (int i = 0; i < n; ++i) {
pairs[i] = {vec[i], i};
}
sort(pairs.begin(), pairs.end());
int nxt = 0;
for (int i = 0; i < n; ++i) {
if(i > 0 && pairs[i-1].first != pairs[i].first) nxt++;
compressed[pairs[i].second] = nxt;
}
}
};
template <typename T>
struct CoordinateCompression {
vector<T> d;
CoordinateCompression(const vector<T> &vec) {
d = vec;
sort(d.begin(), d.end());
d.erase(unique(d.begin(), d.end()), d.end());
}
int get_id(T x) {
return lower_bound(d.begin(), d.end(), x) - d.begin();
}
T get_value(int id) {
return d[id];
}
};