AtCoder、ABC159-D問題をC++実装いたしました。
その際、n個の要素をもつ配列「cnt」に対して、2つのパターンで各要素を0に初期化しております。
pattern_1: cnt[n] = {0};
pattern_2: fill_n(cnt, n, 0);
その際、パターン1の場合は正しく動作し、パターン2の場合は正しく動作しませんでした。
自分の認識では、パターン1、2ともに同様の処理を行なっていると考えておりました。
パターン1と2で挙動が異なる理由をご教示いただけないでしょうか。
c++
1#include <bits/stdc++.h> 2#define rep(i, n) for (int i = 0; i < n; i++) 3using namespace std; 4using ll = long long; 5 6ll comb(int n) 7{ 8 if (n < 2) 9 { 10 return 0; 11 } 12 return n * (n - 1) / 2; 13} 14 15int main() 16{ 17 int n; 18 cin >> n; 19 vector<int> a(n, 0); 20 rep(i, n) cin >> a[i]; 21 rep(i, n) a[i]--; 22 23/*-- pattern_1 正しく動作する配列の宣言 --*/ 24 int cnt[n] = {0} // 配列の全ての要素を0で初期化 25/*-- pattern_1 end --*/ 26 27/*-- pattern_2 正しく動作しない配列の宣言 --*/ 28 int cnt[n]; 29 fill_n(cnt, n, 0); // 配列の全ての要素を0で初期化 30/*-- pattern_2 end --*/ 31 32 ll tot; 33 rep(i, n) cnt[a[i]]++; 34 rep(i, n) tot += comb(cnt[i]); 35 36 ll ans = 0; 37 rep(i, n) 38 { 39 ans = tot; 40 ans -= comb(cnt[a[i]]); 41 ans += comb(cnt[a[i]] - 1); 42 cout << ans << endl; 43 } 44 45 return 0; 46}
プログラムへの入力
5 1 1 2 1 2
pattern_1の出力(正しい動作)
2 2 3 2 3
pattern_2の出力(正しくない動作)
4549177930 4549177930 4549177931 4549177930 4549177931
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/24 13:21