Open devLupin opened 1 year ago
target
이상의 값이 처음 나오는 위치target
보다 큰 값이 처음 나오는 위치ans = upper_bound - lower_bound
upper_bound
가 arr_sz - 1
인 경우는 ans
값을 한 개 올린 값으로 사용해야 한다.a
는 비교할 배열int lower_bound(int target) {
int s = 0, e = a.size() - 1;
while (s < e) {
int m = (s + e) / 2;
if (a[m] >= target) e = m;
else s = m + 1;
}
return e;
}
int upper_bound(int target) {
int s = 0, e = a.size() - 1;
while (s < e) {
int m = (s + e) / 2;
if (a[m] > target) e = m;
else s = m + 1;
}
return e;
}
int main(void)
{
// 탐색을 원하는 숫자 입력받고,
// upper - lower
for (int tmp, i = 0; i < M; i++) {
cin >> tmp;
int lower = lower_bound(tmp);
int upper = upper_bound(tmp);
int ans = upper - lower;
if (upper == N - 1 && a[N - 1] == tmp) ans++; // exception
cout << ans << ' ';
}
return 0;
}
N
개의 수열에서 세 개의 수 합이 0이 되는 경우의 수#include <bits/stdc++.h>
using namespace std;
int n, A[10005];
long long ans;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
for(int i=0; i<n; i++)
cin >> A[i];
sort(A, A+n);
for(int i=0; i<n-2; i++) {
for(int j=i+1; j<n-1; j++) {
int cmp = A[i] + A[j];
int l = lower_bound(A + j + 1, A + n, -cmp) - A;
int u = upper_bound(A + j + 1, A + n, -cmp) - A;
ans += u-l;
}
}
cout << ans;
return 0;
}