rt。代码:
#include <iostream>
#include <cstring>
using namespace std;
#define int long long
const int N = 100010;
const int M = 1010;
struct Range {
int h, w;
} a[N];
int T, n, q;
int f[M][M], f1[M][M];
int t[M][M];
void init() {
memset(a, 0, sizeof(a));
memset(f, 0, sizeof(f));
memset(f1, 0, sizeof(f1));
memset(t, 0, sizeof(t));
}
void solve() {
for (int i = 1; i <= 1000; i++)
for (int j = 1; j <= 1000; j++) f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + t[i - 1][j - 1] * (i - 1) * (j - 1);
for (int i = 1; i <= q; i++) {
int h, w, hh, ww;
cin >> h >> w >> hh >> ww;
cout << f[hh][ww] - f[max(h, w) + 1][max(h, w) + 1] << endl;
}
}
signed main() {
cin >> T;
while (T--) {
cin >> n >> q;
init();
for (int i = 1; i <= n; i++) cin >> a[i].h >> a[i].w, t[a[i].h][a[i].w]++;
solve();
}
}
思路:令 fi,j 表示 h 小于 hi 且 w 小于 wi 的数量,显然有:
fi,j=fi−1,j+fi,j−1−fi−1,j−1+ti−1,j−1×(i−1)×(j−1)其中,ti−1,j−1 表示 h 为 i−1,w 为 j−1 的矩形出现的次数。
但是不知道为什么,Wrong Answer on text 2 了,求助。