N개의 정수가 담긴 배열 A(1<=N<=25,000,000)
이 배열에 대하여 M개의 질의에 답하는 프로그램을 작성하시오
(1<=M<=10,000)
#include <stdio.h>
const int NMAX = (int)25e6; // N개의 정수가 주어짐
const int QMAX = 10000; // 질의 수
static int N, A[NMAX + 1]; // 주어진 숫자 담는 배열
static int M, Q[QMAX + 1]; // 주어진 쿼리 담는 배열
static int ans[QMAX + 1]; // 정답 맞춰보는 배열
extern void initUser(int, int*); // 초기화 함수
extern int query(int); // 질의 던져서 맞는 답이 나오는지 확인
static void input() {
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf("%d", A + i); // A배열에 숫자를 입력 받음
}
scanf("%d", &M); // 쿼리 숫자
for (int i = 0; i < M; ++i) {
scanf("%d", Q + i); // 쿼리 숫자 배열 저장
}
for (int i = 0; i < M; ++i) {
scanf("%d", ans + i); // 정답 저장 배열
}
}
static bool process() {
initUser(N, A); // 초기화 시키고
for (int i = 0; i < M; ++i) {
int result = query(Q[i]);
if (result != ans[i]) return 0;
}
return 1;
}
int main() {
//freopen("input.txt", "r", stdin);
input();
if (process()) puts("100");
else puts("0");
return 0;
}
#define KEY cnt[(a[i] >> k) & mask]
const int P = (1 << 8);
const int mask = P - 1;
int N, b[25000005], cnt[P], start, *a;
void r_sort(int *a, int *b)
{
int i, j, k, *t;
for (k = 0; k < 32; k += 8) {
for (i = 0; i < P; i++) cnt[i] = 0; // 초기화
for (i = 0; i < N; i++) KEY++; // 32비트를 4분할 해서 처음 4비트부터 마지막 4비트 까지 순서를 정렬함
for (i = 1; i < P; i++) cnt[i] += cnt[i - 1]; //누적값 계산
for (i = N - 1; i >= 0; i--) b[--KEY] = a[i]; // 해당 위치에 저장
t = a; a = b; b = t; // 그래서 정렬된 b를 다시 a로 넣음
}
}
void initUser(int nSize, int *arr) { // 숫자랑 배열 들어옴
N = nSize; // 숫자
a = arr; // 포인터
r_sort(arr, b); // 정렬함
for (start = 0; start < N && a[start] >= 0; start++); // 이것 무엇?
}
int query(int idx) {
return a[(idx + start - 1) % N];
}
| 8 7 15 3 0 9 10 1 11 5 2 3 8 1 7 1 3 15 0 11 |
100 |
'Algorithms > simulation' 카테고리의 다른 글
| 2 Problem F : 합이 0이 되는 4개의 숫자들 (0) | 2019.11.06 |
|---|---|
| 3 Problem A : 비밀편지 (0) | 2019.11.06 |
| Problem D : 계수정렬(counting sort)1 (0) | 2019.11.05 |
| 그래프의 삼각형 (0) | 2019.01.30 |
| 추억의 2048 게임 (0) | 2019.01.30 |
댓글