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

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

新規登録して質問してみよう
ただいま回答率
85.46%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1071閲覧

サンプルコードは正解するのに提出したら実行時エラーと表示される。

IkeuchiKenyu

総合スコア6

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/09/05 02:32

##問題
長さ L メートルの直線状の木材があります。
x=1,2,…,L−1 に対して、木材の左端から x メートルの地点には目印として線 x が引かれています。
Q 個のクエリが与えられます。 i 番目のクエリは数の組 (c i,x i ) によって表されます。
以下の説明に従ってクエリを i の昇順に処理してください。
c i=1 のとき : 線 x iがある地点で木材を 2 つに切る。
c i=2 のとき : 線 x iを含む木材を選び、その長さを出力する。
ただし c i=1,2 の両方に対して、線 x iはクエリを処理する時点で切られていないことが保証されます。
問題の詳細はhttps://atcoder.jp/contests/abc217/tasks/abc217_dを参照してください。
###回答の考え方
長さL+1の配列を用意して0,1,・・・,Lとし(はじを0,Lとする)各配列に自分を含む木材の左端と右端を記録させて最終的に右端ー左端で長さを出しています。
###問題点
この問題で以下のコードを作成したのですが、サンプル問題は正解したもののいざ提出してみると実行時エラーと表示されました。自分なりに調べても、今回0で割ったりとかはしていないのでほんとに理由がわかりません。
事実上ののデバック依頼みたいな形で本当に申しわけないのですが、ぜひよろしくお願いいたします。
###code

C++

1#include <iostream> 2#include <vector> 3#include <algorithm> 4using namespace std; 5int main() { 6 int L, Q; 7 cin >> L >> Q; 8 vector<int> c(Q), x(Q); 9 vector<pair<int, int>> ans(L+1,make_pair(0,L)); 10 for (int i = 0;i < Q;i++) { 11 cin >> c.at(i) >> x.at(i); 12 } 13 for (int i = 0;i < Q;i++) { 14 if (c.at(i) == 1) { 15 for (int j = 0;j < x.at(i);j++) { 16 ans.at(j).second = min(ans.at(j).second, x.at(i)); 17 } 18 for (int j = x.at(i)+1;j < L + 1;j++) { 19 ans.at(j).first = max(ans.at(j).first, x.at(i)); 20 } 21 } 22 else { 23 cout << ans.at(x.at(i)).second - ans.at(x.at(i)).first << endl; 24 } 25 } 26}

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

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

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

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

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

guest

回答2

0

ベストアンサー

make_pair が内部的にどういうメモリ確保をしているか存じ上げませんが、
少なくとも、

ans.at(j).first で 4byte(int)
ans.at(j).second で 4byte(int)

1要素で少なくとも8byteは使っていて、j は 0 から L-1 までの L個ということですので、
L=10^9 のとき、

8 [Byte] × 10^9 / 1024[Byte/KByte] / 1024[KByte/MByte] / 1024[MByte/GByte] ≒ 7.45GB > 1GB

(ん、合ってる?)
でメモリが足りていないと思います。

切っていないのに、1m 毎に要素を持つ、というデータの持ち方では、
解けない問題なんだろうと思います。

投稿2021/09/05 12:55

編集2021/09/05 12:56
ak.n

総合スコア291

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

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

IkeuchiKenyu

2021/09/06 01:11

ありがとうございます。これからも精進していきます。
guest

0

Lは最大 10^9、Qは最大 2×10^5 という非常に大きな数字が想定されています。
int 型で表せる範囲を超えています。ビット数が足りません。

提出後、このような大きな入力データでもチェックされますので、
通らなかったと思われます。

投稿2021/09/05 02:58

ak.n

総合スコア291

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

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

actorbug

2021/09/05 03:14

たいていの環境では、int は 32bit で最大 2147483647 までの数を表現できるので、10^9 なら一応 int で表現できるはずです。
ak.n

2021/09/05 03:49 編集

失礼しました。短絡的に回答してすみません。ビット数は足りていました・・・ L に 10^9 を与えると vector<pair<int, int>> ans(L+1,make_pair(0,L)); で実行時エラー(paiza.ioで試行) 入力 1000000000 1 2 1
ak.n

2021/09/05 03:49 編集

1000000000 = 10^9 NG 100000000 = 10^8 OK actorbug さんが正しく、L, Q のビット数の問題ではなく、 メモリ確保の問題かと思います。メモリの制限は幾つでしたかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問