首页 > 其他分享 >记网易笔试一道题

记网易笔试一道题

时间:2022-08-27 23:47:02浏览次数:54  
标签: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
From: https://www.cnblogs.com/PiaYie/p/16631803.html

相关文章

  • 美团秋招笔试四道编程题(第一场)
    第一题小美是美团的一名鲜花快递员,鲜花是一种保质期非常短的商品,所以需要尽快送到客户手中,公司对于骑手的一个要求就是要规划送花的线路,使得骑手送完所有订单走的路程尽可......
  • FPGA笔试面试
         function只能做组合逻辑,不能做时间延续,不能用@,也不能调用task。task都能支持,触发之后,延时100ps进行与 ......
  • [题解]轮流拿牌问题_一道博弈论笔试题(C++)
    题目A和B轮流从一个数组左右两端取数,A先B后,每次取一个数,最终取数总和大者获胜,两人每次都会选择最有利的策略,求获胜者取数的和。思路笔试时遇到的一道算法题,也是博弈论中......
  • 只用20行代码,Python实现爬取网易云音乐,非常简单!
    哈喽,大家好,今天咱们试试只用20行代码来实现批量获取网抑云文件保存本地,炒鸡简单!悄悄的告诉你,其实不到20行代码~  你需要准备本次使用的环境是Python3.8,编......
  • 用网易云实现听歌自由
    1.没有vip怎么办?随便找个网站把要听的歌下到电脑上我用的:  下歌吧_音乐免费下载_音乐在线试听_无损音乐下载(y444.cn)然后上传到网易云云......
  • 牛客网笔试输入输出处理方法总结(基于Python3.5)
    牛客网判题系统输入处理牛客网上的输入输出借鉴ACM模式给出,对于习惯了leetcode函数定义形式解题的小伙伴们来说确实比较生疏。为了避免在之后的笔试中再次吃亏,在这里对牛......
  • 挑战!每天一道 DP 题!
    2022.8.21P2016战略游戏简单树形\(DP\)P3147[USACO16OPEN]262144P很奇怪的\(DP\),令\(f[i][j]\)表示左端点为\(j\),合并出\(i\)所到达的右端点的下一个点的位......
  • 美团笔试(2022.08.20)烤串 【字符串】【双指针】
    字符串双指针的一道简单题不过过程中遇到小问题本题与力扣1768的交替合并字符串一样算法不提主要是ACM模式下的输入输出问题:我写的是intin=0; cin>>i......
  • 美团笔试(2022.08.20)拟合
    主要参考:牛客上分享的帖子以及力扣第72题编辑距离的题解首先用动态规划做是最合适的阶段:对A操作i次,对B操作j次确定dp数组的含义:从数组A【0-i】到与数组B【0-j】保持一致......
  • 网易前端实习面筋
    网易有道前端实习1、自我介绍2、介绍了下项目外卖+是一个移动端的外卖平台,主要功能有定位,商家详情,购物车,下单,支付等一、采用前后端分离的跨域方案,前端采用flexible.j......