chenfy27的刷题记录

导航

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;
    }
};

posted on 2024-03-16 13:07  chenfy27  阅读(16)  评论(0)    收藏  举报