B - Overlapping sheets 解説 by houren

より高速な解法

この問題は、2次元imos法を用いることで\(O(N+\max(A_i) \max(B_i))\) で解くことができます。
028 - Cluttered Paper(★4)において、\(k\geq1\)となるマスの個数を求めると考えるのが良いでしょう。

C++による実装例:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, ans = 0;
    cin >> n;
    vector<vector<int>> imos(101,vector<int>(101,0));
    for(int i=0;i<n;i++){
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        imos[a][c]++;
        imos[a][d]--;
        imos[b][c]--;
        imos[b][d]++;
    }
    for(int i=0;i<101;i++) for(int j=0;j<100;j++) imos[i][j+1] += imos[i][j];
    for(int i=0;i<100;i++) for(int j=0;j<101;j++) imos[i+1][j] += imos[i][j];
    for(int i=0;i<100;i++) for(int j=0;j<100;j++) if(imos[i][j]>0) ans++;
    cout << ans << '\n';
    return 0;
}

投稿日時:
最終更新: