https://www.acmicpc.net/problem/3163
3163번: 떨어지는 개미
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 N, L, k가 주어진다. 다음 N개 줄에는 pi와 ai가 주어진다. ai는 개미의 ID이고, pi는 그 개미의 초기 위치이다. 항상 p
www.acmicpc.net
#include <stdio.h>
int T, N, L, K;
int p[1000001];
int id[1000001]; int front, rear;
int plus[1000001]; int pn, pp;
int minus[1000001]; int mn, mp;
void merge(int data[], int p, int q, int r) {
int i = p, j = q+1, k = p;
int tmp[1000001];
while(i<=q && j<=r) {
if(data[i] <= data[j]) tmp[k++] = data[i++];
else tmp[k++] = data[j++];
}
while(i<=q) tmp[k++] = data[i++];
while(j<=r) tmp[k++] = data[j++];
for(int a = p; a<=r; a++) data[a] = tmp[a];
}
void mergeSort(int data[], int p, int r) {
int q;
if(p<r) {
q = (p+r)/2;
mergeSort(data, p , q);
mergeSort(data, q+1, r);
merge(data, p, q, r);
}
}
void input(){
for (int i = 0; i < 1000001; i++) {
plus[i] = 5000001; minus[i] = 5000001;
}
front = 0; rear = 0; pn = 0; pp = 0; mn = 0; mp = 0;
scanf("%d %d %d", &N, &L, &K);
for (int i = 0; i < N; i++) {
scanf("%d %d", p + i, id + i);
if (id[i] > 0) plus[pn++] = L - p[i];
else minus[mn++] = p[i];
}
}
void ad_hoc(){
mergeSort(plus, 0, pn - 1); mergeSort(minus, 0, mn - 1);
rear = N - 1;
int print;
for (int i = 0; i < K; i++) {
if (plus[pp] < minus[mp]) {
pp++;
rear--;
print = 1;
}
else if (plus[pp] == minus[mp]) {
if (id[front] < id[rear]) {
mp++;
front++;
print = 0;
}
else {
pp++;
rear--;
print = 1;
}
}
else {
mp++;
front++;
print = 0;
}
}
printf("%d\n", print ? id[rear + 1] : id[front - 1]);
}
int main(){
scanf("%d", &T);
while (T--) {
input();
ad_hoc();
}
}
|
cs |
'백준(C, C++) > 플래티넘' 카테고리의 다른 글
백준 14939: 불 끄기 (0) | 2022.08.16 |
---|---|
백준 1047: 울타리 [C/C++] (0) | 2022.08.13 |
백준 2505: 두 번 뒤집기 [C/C++] (0) | 2022.06.03 |