leetcode2250 统计包含每个点的矩形数目
有n个矩形,第i个矩形左下角在(0,0)处,右上角在(l[i],h[i])。另给出m个点(x[i],y[i]),问有多少个矩形覆盖了这个点,点在边上也算是覆盖。
1<=n,m<=5E4; 1<=l[i],h[i]<=1E9; 1<=h[i],y[i]<=100; 所有矩形互不相同,所有查询点互不相同。

分析:二维偏序统计问题,可以离线处理,先对其中一维排序,将第一维可行的记录加到集合,然后在集合中查询第二维。
// Treap模板...
struct node {
int idx, x, y, ans;
};
class Solution {
public:
vector<int> countRectangles(vector<vector<int>>& rect, vector<vector<int>>& points) {
int n = rect.size();
int m = points.size();
sort(rect.begin(), rect.end(), [&](auto &x, auto &y){return x[1]>y[1];});
vector<node> vn(m);
for (int i = 0; i < m; i++) {
vn[i] = {i, points[i][0], points[i][1], 0};
}
sort(vn.begin(), vn.end(), [&](auto &a, auto &b){return a.y>b.y;});
vector<int> ans(m);
Treap<long long> tp;
for (int i = 0, j = 0; i < m; i++) {
while (j < n && rect[j][1] >= vn[i].y) {
tp.insert(rect[j][0]);
j += 1;
}
ans[vn[i].idx] = tp.gecnt(vn[i].x);
}
return ans;
}
};
浙公网安备 33010602011771号