BOJ10816
7278 ワード
BOJ 10816. デジタルカード2
質問する
コード#コード#
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, m, aNum, bNum;
cin >> n;
vector<int> a;
vector<int> b;
for (int i = 0; i < n; i++)
{
cin >> aNum;
a.push_back(aNum);
}
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> bNum;
b.push_back(bNum);
}
sort(a.begin(), a.end());
for (int i = 0; i < b.size(); i++)
{
int cnt = 0;
int temp = b[i];
int left = 0;
int right = a.size() - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] == temp)
{
cnt++;
if (a[mid + 1] != temp)
{
right = mid - 1;
continue;
}
else
{
left = mid + 1;
continue;
}
}
else if (a[mid] < temp)
{
left = mid + 1;
}
else if (a[mid] > temp)
{
right = mid - 1;
}
}
b[i] = cnt;
}
for (int i = 0; i < b.size(); i++)
{
cout << b[i] << ' ';
}
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, m, aNum, bNum;
cin >> n;
vector<int> a;
vector<int> b;
for (int i = 0; i < n; i++)
{
cin >> aNum;
a.push_back(aNum);
}
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> bNum;
b.push_back(bNum);
}
sort(a.begin(), a.end());
for (int i = 0; i < b.size(); i++)
{
int cnt = 0;
int temp = b[i];
int left = 0;
int right = a.size() - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (a[mid] == temp)
{
cnt++;
if (a[mid + 1] != temp)
{
right = mid - 1;
continue;
}
else
{
left = mid + 1;
continue;
}
}
else if (a[mid] < temp)
{
left = mid + 1;
}
else if (a[mid] > temp)
{
right = mid - 1;
}
}
b[i] = cnt;
}
for (int i = 0; i < b.size(); i++)
{
cout << b[i] << ' ';
}
return 0;
}
左から検索してみました.
lower_bound
、upper_bound
コード2
ヘッダファイル:
<algorithm>
STLライブラリlower_bound
、upper_bound
を使用#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, m, aNum, bNum, target;
cin >> n;
vector<int> a;
vector<int>::iterator lower;
vector<int>::iterator upper;
for (int i = 0; i < n; i++)
{
cin >> aNum;
a.push_back(aNum);
}
sort(a.begin(), a.end());
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> target;
upper = upper_bound(a.begin(), a.end(), target);
lower = lower_bound(a.begin(), a.end(), target);
cout << upper - lower << ' ';
}
cout << '\n';
return 0;
}
lower_bound
:この数字が最初に現れた位置upper_bound
:数字の終了位置コード3
関数で実装されたコード
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int lower_binary(vector<int> v, int target, int size)
{
int mid;
int left = 0, right = size - 1;
while (right > left)
{
mid = (left + right) / 2;
if (v[mid] >= target)
right = mid;
else
left = mid + 1;
}
return right;
}
int upper_binary(vector<int> v, int target, int size)
{
int mid;
int left = 0, right = size - 1;
while (right > left)
{
mid = (left + right) / 2;
if (v[mid] > target)
right = mid;
else
left = mid + 1;
}
return right;
}
int main(int argc, char const *argv[])
{
cin.tie(NULL);
ios::sync_with_stdio(false);
int n, m, aNum, bNum, lower, upper;
cin >> n;
vector<int> a;
vector<int> b;
for (int i = 0; i < n; i++)
{
cin >> aNum;
a.push_back(aNum);
}
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> bNum;
b.push_back(bNum);
}
sort(a.begin(), a.end());
for (int i = 0; i < b.size(); i++)
{
lower = lower_binary(a, b[i], n);
upper = upper_binary(a, b[i], n);
if (upper == n - 1 && a[n - 1] == b[i])
upper++;
b[i] = upper - lower;
}
for (int i = 0; i < m; i++)
{
cout << b[i] << '\n';
}
return 0;
}
Reference
この問題について(BOJ10816), 我々は、より多くの情報をここで見つけました https://velog.io/@aksel26/BOJ10816テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol