懷化網(wǎng)站建設(shè)企業(yè)網(wǎng)絡(luò)軟文推廣案例
離散化是將大范圍的數(shù)字映射到小范圍的區(qū)間內(nèi),適用于稀疏的區(qū)間。
兩個問題需要考慮:
1. 原數(shù)組中可能有重復(fù)元素,需要去重。
2. 如何算出離散化后的值(離散化后保序,使用二分)。
題目鏈接:
https://www.acwing.com/problem/content/804/
代碼:
#include <iostream>
#include <vector>
#include <algorithm>using namespace std;typedef pair<int, int> PII;const int N = 300010;int n, m;
int a[N], s[N];vector<int> alls;
vector<PII> add, query;int find(int x)
{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + r >> 1;if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1;
}int main()
{cin >> n >> m;for (int i = 0; i < n; i++){int x, c;cin >> x >> c;add.push_back({x, c});alls.push_back(x);}for (int i = 0; i < m; i++){int l, r;cin >> l >> r;query.push_back({l, r});alls.push_back(l);alls.push_back(r);}// 去重sort(alls.begin(), alls.end());alls.erase(unique(alls.begin(), alls.end()), alls.end());// 處理插入for (auto item : add){int x = find(item.first);a[x] += item.second;}// 預(yù)處理前綴和for (int i = 1; i <= alls.size(); i++) s[i] = s[i - 1] + a[i];// 處理詢問for (auto item : query){int l = find(item.first), r = find(item.second);cout << s[r] - s[l - 1] << endl;}return 0;
}
其中,unique(alls.begin(), alls.end())將數(shù)組中的所有重復(fù)元素去重,返回去重后的數(shù)組的尾端點。使用Java和Python的小伙伴可以使用下列自己實現(xiàn)的方法替換(雙指針?biāo)惴?#xff09;:
vector<int>::iterator unique(vector<int>& a)
{int j = 0;for (int i = 0; i < a.size(); i++)if (!i || a[i] != a[i - 1])a[j++] = a[i];// a[0] ~ a[j - 1] 所有a中不重復(fù)的數(shù)return a.begin() + j;
}