题解:
把火车的区间放入二维矩阵中,比如区间为Li~Ri,则在坐标(Li,Ri)处加1,然后对于每次查询,因为有Li>=p && Ri<=q 存在,所以放在矩阵中就是求矩形中左上角坐标(p,p)和右下角坐标(q,q)构成区域内的数字和。其实严格来说由于Ri>=Li,所以只有上三角区域有不为0的数。这个问题和Range Sum Query 2D Immutable
是等价的。
Sorce Code(C++):
#include <iostream>
using namespace std;
int N, M, Q, p[509][509];
int main() {
cin >> N >> M >> Q;
for (int i = 1; i <= M; i++) { int L, R; cin >> L >> R; p[L][R]++; }
for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) p[i][j] += p[i][j - 1]; }
for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) p[i][j] += p[i - 1][j]; }
for (int i = 1; i <= Q; i++) {
int L, R; cin >> L >> R;
cout << p[R][R] + p[L - 1][L - 1] - p[L - 1][R] - p[R][L - 1] << endl;
}
return 0;
}
感想:
妙啊,真的太tricky了,再一次感叹AtCoder的题目质量之高,看到这题会联想到线段树和树状数组等高级数据结构,思索良久没有思路。看到题解通过巧妙地转化后,问题突然变得简单起来,最后只需要十来行很好码的代码,最后也就感叹一下青题都写不过得蒟蒻我真的菜。