[2002 KAKAO BLIND RECRUITMENT]未破壊の建物


質問リンク
https://programmers.co.kr/learn/courses/30/lessons/92344
アルゴリズム#アルゴリズム#
累計
  • および
  • 解答方法
    最大25万件のクエリのため、重複する問題は時間内に解決できません.
    問題は、建物の体力が0の場合、クエリーが影響を受け、範囲内で計算する値が同じであるため、imos法を使用してすべてのクエリーを処理し、体力がある場合に追加する必要がある値を加算することができます.
    最後に既存の体力を加えれば体力が0より大きい建物を数え切ればいいです
    コード#コード#
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int solution(vector<vector<int>> board, vector<vector<int>> skill) {
        int answer = 0;
        //쿼리의 모든 행동 기록
        vector<vector<int>> query(board.size()+1,vector<int>(board[0].size()+1,0));
        for(auto s:skill){
            //공격스킬
            if(s[0]==1){
                query[s[1]][s[2]] -=s[5];
                query[s[1]][s[4]+1] +=s[5];
                query[s[3]+1][s[2]] +=s[5];
                query[s[3]+1][s[4]+1] -=s[5];
            }else{//회복스킬
                query[s[1]][s[2]] +=s[5];
                query[s[1]][s[4]+1] -=s[5];
                query[s[3]+1][s[2]] -=s[5];
                query[s[3]+1][s[4]+1] +=s[5];
            }
        }
        for(int i = 0;i < query.size();i++)
            for(int j = 1;j < query[i].size();j++)
                query[i][j] += query[i][j-1];
        
        for(int j = 0;j<query[0].size();j++)
            for(int i = 1;i<query.size();i++)
                query[i][j] += query[i-1][j];    
        
        for(int i = 0;i<board.size();i++){
            for(int j = 0;j<board[i].size();j++){
                if((board[i][j]+query[i][j]) > 0)
                    answer++;
            }
        }
        return answer;
    }