第五周任务 - Virtual Judge (vjudge.net)
【题目描述】
在高桥王国,有一条东西向的铁路和沿途的城市,从西到东编号为、、、...。一家名为AtCoder Express的公司拥有火车,火车从一个城市运行到另一个城市(有可能)。高桥国王对以下事项感兴趣:
- 严格在从城市到城市的路段内运行的列车数量,即这样的列车数量。
- N是介于 和(含)之间的整数。1500
- M是介于 和(含)之间的整数。1200 000
- Q是介于 和(含)之间的整数。1100 000
- 1≤Li≤Ri≤N (1≤i≤M)
- 1≤pi≤qi≤N (1≤i≤Q)
解题思路:
用 cntij 表示从 i 到 j 的列车数量。
那么对于询问 p,q,答案就是去求从 (p,p) 这个点到(q,q) 这个点之间二维数组 cnt 的矩形和。
很自然的想到使用二维前缀和来计算这个矩形和。
那么设 sum 数组是 cnt 数组的二维前缀和。
其中 sumij 由二维前缀和公式转来,也就是:
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]
而求矩形和的查找公式是:
sum[q][q]-sum[p-1][q]-sum[q][p-1]+sum[p-1][p-1]
代码如下:
#include<iostream>
using namespace std;
const int mxa = 505, K = 500;
int n, m, q;
long long g[mxa][mxa], p[mxa][mxa];
int main()
{
cin >> n >> m >> q;
for (int a, b, i = 0; i < m; i++) {
cin >> a >> b;
g[a][b]++;
}
for (int i = K; i >= 0; i--){
for (int j = 0; j <= K; j++)
p[i][j] = g[i][j] + p[i + 1][j] + p[i][j - 1] - p[i + 1][j - 1];
}
while (q--) {
int a, b;
cin >> a >> b;
cout << p[a][b] << endl;
}
return 0;
}