for (int i = 2; i <= n; i++) { auto it = lower_bound(v1.begin(), v1.end(), a[i]); // 找到第一个>=a[i]的位置 front[i] = it - v1.begin(); v1.insert(it, a[i]); }
这样正向遍历一遍,我们就能得到需要的front[]数组
反向同理
1 2 3 4 5 6
v2.push_back(a[n]); for (int i = n - 1; i >= 1; i--) { auto it = upper_bound(v2.begin(), v2.end(), a[i]); // 找到第一个>a[i]的位置 back[i] = v2.end() - it; v2.insert(it, a[i]); }
for (int i = 2; i <= n; i++) { auto it = lower_bound(v1.begin(), v1.end(), a[i]); // 找到第一个>=a[i]的位置 front[i] = it - v1.begin(); v1.insert(it, a[i]); }
v2.push_back(a[n]); for (int i = n - 1; i >= 1; i--) { auto it = upper_bound(v2.begin(), v2.end(), a[i]); // 找到第一个>a[i]的位置 back[i] = v2.end() - it; v2.insert(it, a[i]); }
int sum = 0; for (int i = 1; i <= n; i++) { sum += front[i] * back[i]; }