質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1033閲覧

fill_nの挙動について

Python-Beginner

総合スコア17

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/03/23 14:14

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

totを初期化していないのが原因です。
パターン1で動くのは偶然です。

投稿2020/03/23 14:38

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Python-Beginner

2020/03/24 13:21

ご回答ありがとうございます。 totを初期化した結果、どちらのパターンでも正しく動作いたしました。 ご教示いただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問