洛谷P1884

P1884 [USACO12FEB] Overplanting S

难点不只是二维离散化,离散化后的差分部分简直要命

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

int main() {
    int n; cin >> n;
    ll ans = 0;
    vector<int> X1(n), Y1(n), X2(n), Y2(n);
    vector<int> vx, vy;
    vx.reserve(2*n);
    vy.reserve(2*n);
    for(int i = 0; i < n; i++) {
        cin >> X1[i] >> Y1[i] >> X2[i] >> Y2[i];
        vx.push_back(X1[i]);
        vx.push_back(X2[i]);
        vy.push_back(Y1[i]);
        vy.push_back(Y2[i]);
    }

    sort(vx.begin(), vx.end());
    vx.erase(unique(vx.begin(), vx.end()), vx.end());
    sort(vy.begin(), vy.end());
    vy.erase(unique(vy.begin(), vy.end()), vy.end());

    unordered_map<int, int> xid, yid;
    int nx = vx.size(), ny = vy.size();
    vector<vector<int>> diff(nx+1, vector<int>(ny+1, 0));
    
    xid.reserve(nx*2); yid.reserve(ny*2);
    for(int i = 0; i < nx; i++) xid[vx[i]] = i;
    for(int j = 0; j < ny; j++) yid[vy[j]] = j;

    for (int i = 0; i < n; i++) {
        int a = xid[X1[i]], b = xid[X2[i]];
        int xL = min(a, b), xR = max(a, b);
        int c = yid[Y1[i]], d = yid[Y2[i]];
        int yL = min(c, d), yR = max(c, d);
        diff[xL][yL] += 1;
        diff[xL][yR] -= 1;
        diff[xR][yL] -= 1;
        diff[xR][yR] += 1;
    }

    for(int i = 0; i < vx.size(); i++) {
        for(int j = 0; j < vy.size(); j++) {
            if(i > 0) diff[i][j] += diff[i - 1][j];
            if(j > 0) diff[i][j] += diff[i][j - 1];
            if(i > 0 && j > 0) diff[i][j] -= diff[i - 1][j - 1];
        }
    }
    for(int i = 0; i < vx.size() - 1; i++) {
        for(int j = 0; j < vy.size() - 1; j++) {
            if(diff[i][j] > 0) {
                ll dx = vx[i + 1] - vx[i];
                ll dy = vy[j + 1] - vy[j];
                ans += dx * dy;
            }
        }
    }
    cout << ans << '\n';
    return 0;
}
posted @ 2025-05-17 14:33  Chuan81  阅读(9)  评论(0)    收藏  举报