Official

D - Distance Table Editorial by mechanicalpenciI


\(1\leq i<j\leq N\) をみたす整数の組 \((i,j)\) それぞれについて、駅 \(i\) と駅 \(j\) の間の距離は \(D_i+D_{i+1}+\cdots+D_{j-1}\) で計算できるため、これを for 文を用いて計算すれば良いです。
この方針を愚直に実装すると \(3\) 重 ループを用いて実装することができ、今回の制約下で十分高速です。

なお、駅 \(1\) から駅 \(k\) までの距離を \(S_k=D_1+D_2+\cdots+D_{k-1}\) とすると、駅 \(i\) と駅 \(j\) の間の距離が \(S_j-S_i\) で計算できることを用いると、\(2\) 重 ループでより高速に求めることができます。

c++ による実装例(\(3\) 重ループ):

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	cin>>n;
	
	vector<int>d(n-1);
	for(int i=0;i<n-1;i++){
		cin>>d[i];
	}

	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			int ans = 0;
			for(int k=i;k<j;k++)ans+=d[k];
			cout << ans;
			if(j<(n-1))cout << " ";
			else cout << endl;
		}
	}

	return 0;
}

c++ による実装例(\(2\) 重ループ) :

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n;
	cin>>n;
	
	vector<int>s(n);
	for(int i=1;i<n;i++){
		cin>>s[i];
		s[i]+=s[i-1];
	}

	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			cout<<(s[j]-s[i]);
			if(j<(n-1))cout<<" ";
			else cout<<endl;
		}
	}

	return 0;
}

Python による実装例(\(3\) 重ループ):

n=int(input())
d=list(map(int, input().split()))

for i in range(n-1):
    for j in range(i+1,n):
        if j<n-1:
            print(sum(d[i:j]),end=' ')
        else:
             print(sum(d[i:j]))

posted:
last update: