RT,我觉得深进已经很详细了,只不过我太弱了...
就这个↓
#include <bits/stdc++.h>
#define maxn 4010
using namespace std;
int a[maxn][4];
int b[maxn];
int c[maxn];
int f[maxn][maxn];
int btop;
int ctop;
map<int, int> m; //map优化,因为map本身是由红黑树(我也不知道是啥但是个树就完事了)实现的
int n;
//那么就自动的声省掉了二分查找的步骤(直接索引就行了查找就抛弃了)
//这道题的新点在于map与差分的优化
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 0 ; j < 4; j++) {
cin >> a[i][j];
b[++btop] = a[i][j]; //存入数据
}
}
sort(b + 1, b + btop + 1); //离散化,有什么好说的
b[0] = -1e7;
for (int i = 1; i <= btop; i++) {
if (b[i] != b[i - 1]) {
c[++ctop] = b[i];
m[b[i]] = ctop; //直接就标上号了
}
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 4; j++) {
a[i][j] = m[a[i][j]];
}
}
//从这往上我相信我还是明白的
for (int k = 1; k <= n; k++) {
for (int i = a[k][0]; i < a[k][2]; i++) {
f[i][a[k][3]]++;
f[i][a[k][1]]--; //差分操作...
}
}
for (int i = 1; i < ctop; i++) {
for (int j = 1; j < ctop; j++) {
f[i][j] += f[i][j - 1]; //求前缀和(为什么我想到了dp...)
}
}
long long ans = 0;
for (int i = 1; i < ctop; i++) {
for (int j = 1; j < ctop; j++) {
if (f[i][j]) {
ans += (long long)(c[i + 1] - c[i]) * (c[j + 1] - c[j]);
}
}
}
cout << ans;
return 0;
}