##問題
長さ 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}
回答2件
あなたの回答
tips
プレビュー