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

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

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

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

Q&A

解決済

1回答

3224閲覧

std::out_of_rangeのエラーが取れません

michirakara

総合スコア2

C++

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

0グッド

0クリップ

投稿2022/07/10 03:24

AtCoderの典型90問の10で全く意味不明なout_of_rangeエラーが出て困っています。(https://atcoder.jp/contests/typical90/tasks/typical90_j)
自分でも考えてみたのですがなぜ 18446744073709551615 のような大きな数字が出てくるのかがわかりません。回答よろしくおねがいします。

C++(GCC

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int n, q, tmp, tmp2; 6 cin >> n; 7 vector<int> p1(n); 8 vector<int> p2(n); 9 10 cin >> tmp >> tmp2; 11 if (tmp == 1) { 12 p1.at(0) = tmp2; 13 p2.at(0) = 0; 14 } else { 15 p2.at(0) = tmp2; 16 p1.at(0) = 0; 17 } 18 19 for (int i = 1; i < n; i++) { 20 cin >> tmp >> tmp2; 21 if (tmp == 1) { 22 p1.at(i) = p1.at(i - 1) + tmp2; 23 p2.at(i) = p2.at(i - 1); 24 } else { 25 p2.at(i) = p2.at(i - 1) + tmp2; 26 p1.at(i) = p1.at(i - 1); 27 } 28 } 29 30 cin >> q; 31 vector<int> l(q); 32 vector<int> r(q); 33 for (int i = 0; i < q; i++) { 34 cin >> l.at(i) >> r.at(i); 35 } 36 37 for (int i = 0; i < q; i++) { 38 cout << p1.at(r.at(i) - 1) - p1.at(l.at(i) - 2) << " " 39 << p2.at(r.at(i) - 1) - p2.at(l.at(i) - 2) << endl; 40 } 41}

入力

input

17 21 72 32 78 42 94 51 23 62 89 71 40 81 75 910 101 3 112 4 123 5 134 6 145 7 151 5 162 6 173 7 181 6 192 7 20

出力

error

1terminate called after throwing an instance of 'std::out_of_range' 2 what(): vector::_M_range_check: __n (which is 18446744073709551615) >= this->size() (which is 7)

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

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

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

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

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

guest

回答1

0

ベストアンサー

p1.at(l.at(i) - 2)においてl.at(i) - 2の値が-1のような負の値をとると、at内部では符号なし値として扱われて提示のような巨大な数値としての範囲外エラーになります。
今回の入力例では1 3の行において発生しています。

投稿2022/07/10 03:52

can110

総合スコア38352

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

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

michirakara

2022/07/10 13:01 編集

ありがとうございます! for (int i = 0; i < q; i++) { if (l.at(i) == 1) { cout << p1.at(r.at(i) - 1) << " " << p2.at(r.at(i) - 1) << endl; } else { cout << p1.at(r.at(i) - 1) - p1.at(max(l.at(i) - 2, 0)) << " " << p2.at(r.at(i) - 1) - p2.at(max(l.at(i) - 2, 0)) << endl; } } のようにif文を追加することによってACが付きました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問