Official
D - Distance Table Editorial
by
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: