数组写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const int N = 1e5 + 5;
int n, m;
int a[N], b[N]; // a[]为原数组,b[]是离散化后的数组,下标范围分别是 [1, n],[1, m]

void init()
{
sort(a + 1, a + 1 + n); // 先对数组排序
m = 0;
for (int i = 1; i <= n; i++)
if (i == 1 || a[i] != a[i - 1])
b[++m] = a[i];

// 或STL: m = unique(a + 1, a + 1 + n) - a; 这种写法会丢失原数组
}

int query(int x)
{
return lower_bound(b + 1, b + m + 1, x) - b;
}

vector 写法

1
2
3
4
5
6
// std::vector<int> arr;
std::vector<int> tmp(arr); // tmp 是 arr 的一个副本
std::sort(tmp.begin(), tmp.end());
tmp.erase(std::unique(tmp.begin(), tmp.end()), tmp.end());
for (int i = 0; i < n; ++i)
arr[i] = std::lower_bound(tmp.begin(), tmp.end(), arr[i]) - tmp.begin();

参考资料


本站由 zaochen 使用 Stellar 1.33.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
全站访问量 - 次 · 访客数 - 人 · 本页面浏览 -