离散化适用于数据的值域很大,但数量少的情况。可以将数据映射到 1, 2, 3, …, n。
对数组进行排序去重
1 2 3 4 5 6 7 8 9 10 11 12
| sort(alls.begin(), alls.end()); alls.erase(unique(alls.begin(), alls.end()), alls.end());
int find(int x) { int l=0, r=alls.size()-1; while(l<r) { int mid = l+r>>1; if(x>=alls[mid]) r=mid; else l = mid+1; } return r+1; }
|
区间和
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 45 46 47 48 49 50 51 52 53
| #include <iostream> #include <vector> #include <algorithm>
using namespace std;
const int N = 300010;
int n,m; int a[N], s[N];
typedef pair<int,int> PII; vector<PII> add, query; vector<int> alls;
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 l; }
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; } 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; } }
|