Atcoder Express2
今回はソースコードだけ(コード内にメモ用解説があります)
N,M,Q=map(int,input().split()) answer=[[0]*N for i in range(N)] for i in range(M): L,R=map(int,input().split()) answer[N-L][R-1]+=1 for i in range(1,N): answer[0][i]+=answer[0][i-1] answer[i][0]+=answer[i-1][0] print(answer[0]) for i in range(1,N): for j in range(1,N): answer[i][j]+=answer[i-1][j] answer[i][j]+=answer[i][j-1] answer[i][j]-=answer[i-1][j-1] for i in range(Q): p,q=map(int,input().split()) print(answer[N-p][q-1]) ''' #図のような正方形で累積和を考える こう取ればLが1でRが10の時(一番右下の時)全ての区間が入るように和を計算できる 1 2 3 4 5 6 7 8 9 10 ←R 10 1 9 8 7 1 6 1 1 5 1 4 1 2 3 2 1 1 1 ↑ L 例えば、L,R=5,8の電車はもちろん5,8の区間に含まれている。 ここで5,8の区間に含まれる電車の数を考えると5,7の電車や6,8の電車は含まれている... という風に考えると累積和を取れる ここで、6,7の区間に含まれる電車の数は5,7と6,8を数えることで2回計算されているのでマイナスする '''