일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- Next
- MongoDB
- 게임 서버 아키텍처
- pm2
- ERD
- branch
- JavaScript
- 백준 15824번
- 자바스크립트
- trie
- gcd(n. k) = 1
- localstorage
- Github
- MySQL
- 트라이
- 그리디
- 이분 탐색
- DP
- 그래프 탐색
- router
- html5
- ccw 알고리즘
- insomnia
- Express.js
- Prisma
- 백준 1086번
- string
- map
- PROJECT
- HTTP
Archives
- Today
- Total
dh_0e
[PS] 합이 0인 네 정수 / C++ (백준 7453번) 본문
구현은 매우 쉽지만 발상하는데 시간이 꽤 걸렸던 문제
A B의 합, C D의 합을 모두 구한 배열(각각 최대 1600만) 2개를 만든 뒤 정렬하여 two pointer, binary search를 사용하여 합이 0인 쌍의 개수를 구하면 된다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
vector<ll> vec1, vec2;
ll a[4001], b[4001], c[4001], d[4001];
int binary_search(int en, int target) {
int st = 0;
while (st < en) {
int mid = (st + en) / 2;
if (vec2[mid] == target) {
en = mid;
}
else {
st = mid + 1;
}
}
return en;
}
int main()
{
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld %lld %lld", &a[i], &b[i], &c[i], &d[i]);
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
vec1.push_back(a[i] + b[j]);
vec2.push_back(c[i] + d[j]);
}
}
sort(vec1.begin(), vec1.end());
sort(vec2.begin(), vec2.end());
long long dap = 0;
int n1 = 0, n2 = vec2.size() - 1, vec1_size = vec1.size();
while (1) {
if (n1 == vec1_size || n2 == -1)break;
if (vec1[n1] + vec2[n2] == 0) {
int f_same = binary_search(n2, vec2[n2]);
n1++;
dap += n2 - f_same + 1;
}
else if (vec1[n1] + vec2[n2] > 0)
n2--;
else
n1++;
}
printf("%lld\n", dap);
return 0;
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[PS] 열쇠 / C++ (백준 9328번) (0) | 2025.02.13 |
---|---|
[PS] 텀 프로젝트 / C++ (백준 9466번) (0) | 2025.02.04 |
[PS] 음악 프로그램 / C++ (백준 2623번) (3) | 2024.11.21 |
[PS] 더 흔한 타일 색칠 문제 / C++ (백준 28298번) (0) | 2024.08.23 |
[PS] 자석 / C++ (백준 28303번) (0) | 2024.08.22 |