求解释深进的代码,我太弱了有点不理解,......[捂脸哭]
查看原帖
求解释深进的代码,我太弱了有点不理解,......[捂脸哭]
759274
Stevehim楼主2023/1/9 22:18

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

2023/1/9 22:18
加载中...