白駿1920号:水を探しています
14554 ワード
リンク:https://www.acmicpc.net/problem/1920
Nまでの並びがあります.Xという整数が存在するかどうかを見つけなければなりません.
最初に配列に入れたときに、この木に入れて探索してみるとちょうど良いです.
Out Of Bounds:右側のノードに積み重ね続けたら?ノードの数は100000個ですが、配列のサイズは287100000+22*100000+2287100000+2でなければなりません.
簡単なstructを作成すると
アルゴリズムライブラリのsortを借りる
残念ながらなぜか最初のオフサイドを逃してしまいました最後に、
そして確認したまた忘れた.
問題を読む
Nまでの並びがあります.Xという整数が存在するかどうかを見つけなければなりません.
最初に配列に入れたときに、この木に入れて探索してみるとちょうど良いです.
コード#コード#
#include<iostream>
using namespace std;
int arr[100001]{ 0, };
bool full[100001]{ false, };
int main() {
int N, elem, tmp;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> elem;
tmp = 0;
while (full[tmp] == true){
if (arr[tmp] < elem)
tmp = (2 * tmp) + 2;
else
tmp = (2 * tmp) + 1;
}
arr[tmp] = elem;
full[tmp] = true;
}
cin >> N;
for (int j = 0; j < N; j++) {
cin >> elem;
tmp = 0;
while (full[tmp] == true && arr[tmp] != elem) {
if (arr[tmp] < elem)
tmp = (2 * tmp) + 2;
else
tmp = (2 * tmp) + 1;
}
if (arr[tmp] == elem)
cout << 1 << "\n";
else
cout << 0 << "\n";
}
return 0;
}
簡単なstructを作成すると
->
ポインタ未整理エラーアルゴリズムライブラリのsortを借りる
#include<iostream>
#include<algorithm>
using namespace std;
int arr[100001];
int main() {
cin.tie(NULL);
int N, M, elem;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr + N);
bool check = false;
cin >> M;
for (int i = 0; i < M; i++) {
cin >> elem;
int start = 0, end = N - 1, mid;
while (start <= end){
mid = (start + end) / 2;
if (arr[mid] < elem) {
start = mid+1;
}
else if(arr[mid] > elem){
end = mid-1;
}
else {
check = true;
break;
}
}
if (check) {
cout << "1\n";
check = false;
}
else
cout << "0\n";
}
return 0;
}
ぶんせき
残念ながらなぜか最初のオフサイドを逃してしまいました最後に、
while (start <= end)
に条件が設定されている場合、midが設定されていなくても、start<=end
が設定されていれば問題はない.そして確認したまた忘れた.
if (check) {
cout << "1\n";
check = false;
}
Reference
この問題について(白駿1920号:水を探しています), 我々は、より多くの情報をここで見つけました https://velog.io/@ntbij29/백준-1920번-수-찾기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol