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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

147閲覧

AtCoder ABC369 C問題 がACにならない

LunaShoot

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2025/01/11 04:50

編集2025/01/11 04:52

実現したいこと

  • AtCoder の ABC369 の C問題がACにならない原因を突き止めたいです。

前提

AtCoder の ABC369 の C問題に回答したところ、AC * 19, WA * 2でWAとなりました。しかし、原因がわかりません。
問題のページのurlを以下に添付します。

https://atcoder.jp/contests/abc369/tasks/abc369_c

言語はC#を用いています。
アルゴリズムは尺取り法を用いました。

該当のソースコード

C#

1var n = long.Parse(Console.ReadLine()); 2var a = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToList(); 3 4var r = 0; 5var ans = 0; 6for (int l = 0; l < n; l++) // l から始まる等差数列の数をansに足していく 7{ 8 while (true) 9 { 10 if ((r > l + 1 && a[r] - a[r - 1] != a[l + 1] - a[l])) // r を含めると等差数列が終わる 11 { 12 r--; // 手前までは等差数列 13 ans += r - l + 1; 14 break; 15 } 16 else if (r == n - 1) // 最後まで到達し、尚且つ等差数列である 17 { 18 ans += r - l + 1; 19 break; 20 } 21 r++; 22 } 23} 24Console.WriteLine(ans);

試したこと

  • 問題のページにある入力例を入力し、出力が出力例と一致することを確認しました。

  • 極端な場合として N = 1の場合と、Aiが10^9に近い場合を試し、想定通りの出力であることを確認しました。

  • ChatGPTを用いて原因究明を試みましたが、失敗に終わりました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下の入力例に対し、正しい出力は20000100000になるはずですが、ご提示のコードだと-1474736480になります。

200000 1 1 1 ...(20万個の繰り返し)... 1

投稿2025/01/11 06:25

actorbug

総合スコア2460

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

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

LunaShoot

2025/01/11 07:05

回答ありがとうございます。 Nが大きい場合に原因があるようなのでそれを踏まえてコードを改善してみます。
LunaShoot

2025/01/11 07:11

ans が int型でオーバーフローしていたというとても初歩的なミスでした。long型に変えたら通りました。 ありがとうございました。
guest

0

l == n-1の時に配列aの上限を超えてアクセスしてませんか?

if ((r > l + 1 && a[r] - a[r - 1] != a[l + 1] - a[l])) // r を含めると等差数列が終わる

外側のループでlがインクリメントした際にrの値がそのままなのもおかしいですね。r=lにリセットしないとだめだと思います。

投稿2025/01/11 06:11

編集2025/01/11 06:27
TaroToyotomi

総合スコア1454

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

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

LunaShoot

2025/01/11 06:59

回答ありがとうございます。私の考えでは、どちらも問題ないと思っています。 最初の条件 r > l + 1 の時点で l == n - 1 の場合ははじかれると思います。なぜなら、 r == n - 1 に達すると r++ が実行されないため、 r <= n - 1 だからです。 また、 r = l という初期化についてなのですが、 l が更新されるのは、等差数列が崩れた時です。例えば、l = 3 の場合、r = 7 までは等差数列であったが、 r = 8 を含めると等差数列ではなくなるという状況の時、 l = 4 となり、そのとき r = 7 となります( r-- によって)。ここで、l = 3 から r = 7 は等差数列だったので、 l = 4 から r = 7 も必ず等差数列になります。したがって、r = l と初期化せずとも、l はそのままでも問題ないと考えました。 また、 r = l と初期化しても誤りにはならないと思ったため書き加えて提出してみたところTLEとなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問