洛谷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;
}

浙公网安备 33010602011771号