ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

记网易笔试一道题

2022-08-28 00:05:06  阅读:164  来源: 互联网

标签:vector 网易 activate int 笔试 一道 valid rec out


 

 矩形面积 III

现给该题做一次修改,只计算那些有重叠的矩形,即如果有一个矩形不和其它矩形重叠【有面积意义,线段的重叠和点的重叠无】,那么就不计算它的面积。

 

#include<iostream>
#include<vector>
#include<tuple>
#include<algorithm>
#include<set>
using namespace std;


const static int MOD = 1000000007;
const static int OPEN = 0;
const static int CLOSE = 1;


// 计算宽度:其实就是不断累加更大的x的差值即可
int QueryWidth(multiset<pair<int, int>>& activate)
{
    int res = 0;
    int maxX = -1;
    for (auto x : activate)
    {
        maxX = max(maxX, x.first);
        // 如果x变大了,则计算差值累加更大的宽度
        res += max(0, x.second - maxX);
        // 不断更新最大x
        maxX = max(maxX, x.second);
    }
    return res;
}

void QueryValid(vector<vector<int>>& rectangles,multiset<pair<pair<int, int>, int>>& activate, const vector<int>& out_edge, set<int>& valid)
{
    for (auto &x : activate)
    {
        // 入边的x是不是 和目前的出边有交叉  
        if (x.second != out_edge[4]) {
            if ((x.first.first < out_edge[3] && x.first.second > out_edge[3]) ||
                (x.first.first < out_edge[2] && x.first.second > out_edge[2]) ||
                (x.first.first >= out_edge[2] && x.first.second <= out_edge[3]) ||
                (x.first.first < out_edge[2] && x.first.second > out_edge[3])) {
                    if (out_edge[0] > rectangles[x.second][1]) {
                        valid.insert(out_edge[4]);
                        valid.insert(x.second);
                    }

            }
        }
    }

}
        

int rectangleArea(vector<vector<int>>& rectangles, set<int> & valid)
{
    if (valid.size() == 0) return 0;
    vector<vector<int>> rec;
    int cnt = 0;
    for (auto v : rectangles)
    {
        if (valid.find(cnt)!= valid.end()) {
            rec.push_back({ v[1], OPEN, v[0], v[2] });
            rec.push_back({ v[3], CLOSE, v[0], v[2] });
        }
        cnt++;
    }
    // 排序从下到上来扫描
    sort(rec.begin(), rec.end());

    // 存储面积和
    int res = 0;
    // 初始化第一个y的位置
    int lastY = rec[0][0];
    // 当前需要计算的面积横坐标 [x1,x2]
    // 扫描过程中 对于每次OPEN则插入,CLOSE则删除
    multiset<pair<int, int>> activate;

    for (const vector<int> r : rec)
    {
        int y = r[0];
        int state = r[1];
        int x1 = r[2];
        int x2 = r[3];

        // 累加面积
        res = (res + (long long)QueryWidth(activate) * (y - lastY)) % MOD;
        // 更新上一个y坐标
        lastY = y;
        // 对于每次OPEN则插入,CLOSE则删除
        if (state == OPEN)
        {
            activate.insert(make_pair(x1, x2));
        }
        else
        {
            activate.erase(activate.find(pair<int, int>{x1, x2}));
        }
    }

    return res;
}

bool ispoint_in_rectangle(int px, int py, int x0, int y0, int x1, int y1) {
    if ((px >= x0 && px <= y0) && (py >= y0 && py <= y1)) return true;
    else return false;
}

set<int> setvalidrectangle(vector<vector<int>>& rectangles) {
    vector<vector<int>> rec;
    int cnt = 0;
    for (auto v : rectangles)
    {
        rec.push_back({ v[1], OPEN, v[0], v[2],cnt });
        rec.push_back({ v[3], CLOSE, v[0], v[2],cnt });
        cnt++;
    }
    // 排序从下到上来扫描
    sort(rec.begin(), rec.end());

    // 存储有效的矩形
    set<int> valid;
    // 初始化第一个y的位置
    int lastY = rec[0][0];
    //
    // 扫描过程中 对于每次OPEN则插入,CLOSE则删除
    multiset<pair<pair<int, int>,int>> activate;  //入边的x0 x1 矩形的高度 

    for (const vector<int> r : rec)
    {

        int y = r[0];
        int state = r[1];
        int x1 = r[2];
        int x2 = r[3];
        int belong = r[4];

            
        if (state == OPEN)
        {
            activate.insert(make_pair(make_pair(x1, x2), belong));
        }
        else
        {
            //当前出边数据 y  state  x1  x2 belong
            QueryValid(rectangles,activate, r, valid);
            activate.erase(activate.find(make_pair(make_pair(x1, x2), belong)));
        }
    }

    return valid;

}


int main() {
    vector<vector<int>> A = { {0,0,2,2}, {1,1,4,3}, {2,4,4,7}, {2,5,3,6} };
    vector<vector<int>> B = { {0,0,1,1}, {1,1,2,2}, {1,0,2,1}};
    set<int> valid = setvalidrectangle(B);
    int ret = rectangleArea(B, valid);
    cout << ret << endl;
    
}

 

标签:vector,网易,activate,int,笔试,一道,valid,rec,out
来源: https://www.cnblogs.com/PiaYie/p/16631803.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有