ABC106 D - AtCoder Express 2

問題

n個の都市とm本の列車があり、i本目の電車は区間[li, ri]を走っている
各クエリで[l,r]に「走る区間が完全に含まれる」ような列車の本数を出力する

n<=500, m<=2*10^5, q<=10^5

解法

区間[l,r]を走る列車について考える
これを二次元平面上の (y座標,x座標) = (l,r) の点とみなすと、この列車を完全に含むような区間は、y<=l(∴ 区間の左端がl以下)かつr<=x(∴ 区間の右端がr以上)の範囲全てになる
だからまずは各列車を点とみなしたときの座標に+1しといて、それらを右と上に伸ばしておけば(O(N^2)の二次元累積和)、各クエリにO(1)で答えられるようになる

制約からO(QN)が間に合うから各行[列]で一次元累積和してクエリごとにO(N)が基本的な想定解だったらしい
そこまで辿り着けたなら二次元累積和した方が早くね?

実装

dpではない

int n, m, q, l, r, dp[505][505];

signed main() {
	cin >> n >> m >> q;
	rep(i,m) {
		cin >> l >> r;
		dp[l][r]++;
	}
	rep(i,501) rep(j,501) dp[i][j+1] += dp[i][j];
	rep(j,501) for(int i=500; i>0; --i) dp[i-1][j] += dp[i][j];
	while (q--) {
		cin >> l >> r;
		cout << dp[l][r] << endl;
	}
}