ICode9

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

【墨鳌】【简单题,但是要细致一点,别忘了关灯的时候把自己也关了

2022-02-09 14:04:25  阅读:193  来源: 互联网

标签:pr int auto 也关 second vector 关灯 墨鳌 first


题目链接
题解链接

题外话

无意间在评论区发现了原来是 125周赛题
所以晚上补充一下,他山之石,可以攻玉, @bigelephant29

解题思路

  • 每一个灯(坐标),有五个属性:
  1. 行 (横坐标 x )
  2. 列 (纵坐标 y )
  3. 撇 (直线 y=x+t \(\Longrightarrow\) 记录 x-y )
  4. 捺 (直线 x+y=t \(\Longrightarrow\) 记录 x+y )
  5. 表示坐标本身的二元组 (坐标 (x,y) )
  • 前四者之一为真,即亮灯
  • 然后用哈希表存一下,这五组特性,实时维护开关灯,就OK啦

代码

#define R row               //横坐标
#define C column            //纵坐标
#define P leftDown2RightUp  //y=x+t  => x-y
#define L rightDown2leftUp  //x+y=t  => x+y
#define O onLamps           //亮着的灯的集合
class Solution {    
public:
    const vector<vector<int>>ds{{0,0},{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
    vector<int> gridIllumination(int n, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
        unordered_map<int,int>R,C,P,L;
        set<pair<int,int>>O;
        auto shift=[&](int&x,int&y,int o){R[x]+=o,C[y]+=o,P[x-y]+=o,L[x+y]+=o;};
        for(auto&p:lamps){
            auto&x=p[0],&y=p[1];
            auto lamp=make_pair(x,y);
            if(O.count(lamp)==0)O.insert(lamp),shift(x,y,1);
        }
        vector<int>ans;
        for(auto&p:queries){
            auto&x=p[0],&y=p[1];
            ans.push_back((R[x] || C[y] || P[x-y] || L[x+y]));
            for(auto&d:ds){
                auto nx=x+d[0],ny=y+d[1];
                auto lamp=make_pair(nx,ny);
                if(O.count(lamp)>0)O.erase(lamp),shift(nx,ny,-1);
            }
        }
        return ans;
    }
};
class Solution {
public:
    unordered_map<int, int> ver, hor;
    unordered_map<int, int> d1, d2;
    set<pair<int,int>> st;
    
    void add(pair<int,int> pr) {
        ver[pr.first]++;
        hor[pr.second]++;
        d1[pr.first+pr.second]++;
        d2[pr.first-pr.second]++;
        st.insert(pr);
    }
    
    void close(pair<int,int> pr) {
        ver[pr.first]--;
        hor[pr.second]--;
        d1[pr.first+pr.second]--;
        d2[pr.first-pr.second]--;
        st.erase(pr);
    }
    
    int query(pair<int,int> pr) {
        return ver[pr.first] > 0 || hor[pr.second] > 0 || d1[pr.first+pr.second] > 0 || d2[pr.first-pr.second] > 0;
    }
    
    vector<int> gridIllumination(int N, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
        for(auto e: lamps) {
            add(make_pair(e[0], e[1]));
        }
        vector<int> ans;
        for(auto e: queries) {
            int x = e[0], y = e[1];
            ans.push_back(query(make_pair(x,y)));
            for(int i = -1 ; i <= 1 ; i++) {
                for(int j = -1 ; j <= 1 ; j++) {
                    if(st.find(make_pair(x+i, y+j)) != st.end()) {
                        close(make_pair(x+i,y+j));
                    }
                }
            }
        }
        return ans;
    }
};

标签:pr,int,auto,也关,second,vector,关灯,墨鳌,first
来源: https://www.cnblogs.com/JasonCow/p/15874668.html

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

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

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

ICode9版权所有