문제
음이 아닌 정수를 원소로 하는 최대 32개까지 담을 수 있는 집합이 있다.
집합에 담긴 원소는 유일해야 하므로 같은 원소를 포함하지 않는다.
집합에 담기는 원소는 0 ~ 31까지의 정수이다.
따라서 주어지는 주어진 정수가 31을 초과하는 경우 32로 나눈 나머지로 계산한다.
사용자 프로그램(user.cpp)은 아래 api 함수를 완성 해야 한다.
사용자 프로그램은 헤더파일을 추가할 수 없다.
필요한 함수와 변수를 추가하여 작성할 수 있으나 제출시에 함께 제출한다.
[user.cpp 템플릿 코드]
/// === user.cpp ===
/// 각 테스트 케이스에 대하여 1번 호출된다. 집합을 공집합으로 만든다.
void Init(){
}
/// 집합에 포함된 모든 원소들을 삭제하고 기존에 없었던 원소들을 추가한다.
void Flip(){
}
/// 집합에 원소 k가 없다면 추가, 있다면 아무일도 하지 않는다.
void Insert(int k){
}
/// 집합에 원소 k가 있다면 삭제, 없다면 아무일도 하지 않는다.
void Erase(int k){
}
/// 집합에 원소 k가 집합안에 있다면 1, 없다면 0을 반환한다.
int Find(int k){
}
/// 집합에 원소 k가 없다면 추가, 있다면 삭제한다.
void Inverse(int k){
}
/// 집합에 모든 원소를 삭제하고 기존 원소에 k를 더한 원소들로 채운다.
/// k를 더한 원소가 31을 초과하는 경우 32로 나눈 나머지를 새로운 원소로 한다.
void Plus(int k){
}
/// 집합에 모든 원소를 삭제하고 기존 원소에 k를 뺀 원소들로 채운다.
/// k를 뺀 원소가 음수인 경우 32로 나눈 나머지에 32를 더한 결과를 새로운 원소로 한다.
void Minus(int k){
}
/// k보다 작거나 같은 원소들 중 집합에 있는 원소를 모두 삭제한다.
void Clear(int k){
}
/// k보다 작거나 같은 원소들 중 집합에 없는 원소를 추가한다.
void Fill(int k){
}
[ main.cpp] 템플릿 코드]
#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
4_집합관리
*/
/// === main.cpp ===
#include <stdio.h>
enum {
INIT = 0,
FLIP = 1,
INSERT = 2,
ERASE = 3,
FIND = 4,
INVERSE = 5,
PLUS = 6,
MINUS = 7,
CLEAR = 8,
FILL = 9,
};
static int N;
extern void Init();
extern void Flip();
extern void Insert(int k);
extern void Erase(int k);
extern int Find(int k);
extern void Inverse(int k);
extern void Plus(int k);
extern void Minus(int k);
extern void Clear(int k);
extern void Fill(int k);
static int run() {
int cmd, k;
int ans, result;
Init();
for (int i = 0; i < N; ++i) {
scanf("%d %d", &cmd, &k);
k &= 31;
switch (cmd) {
case FLIP:
Flip();
break; /// 1
case INSERT:
Insert(k);
break; /// 2
case ERASE:
Erase(k);
break; /// 3
case FIND:
result = Find(k); /// 4
scanf("%d", &ans);
if (ans != result) return 0;
break;
case INVERSE:
Inverse(k);
break; /// 5
case PLUS:
Plus(k);
break; /// 6
case MINUS:
Minus(k);
break; /// 7
case CLEAR:
Clear(k);
break; /// 8
case FILL:
Fill(k);
break; /// 9
}
}
return 1;
}
int main() {
freopen("input.txt", "r", stdin);
int TC;
scanf("%d", &TC);
for (int tc = 1; tc <= TC; ++tc) {
scanf("%d", &N);
if (run()) printf("Test %d : 100\n", tc);
else printf("Test %d : 0\n", tc);
}
return 0;
}
입력
첫 행에 테스트 케이스의 수 TC가 입력된다. (1 <= TC <= 50)
각 테스트 케이스의 첫 행에는 명령수 N이 입력된다. (1 <= N <= 500,000)
각 명령은 행 단위로 입력된다.
출력
테스트 케이스를 모두 통과한 경우 100을 그렇지 않은 경우 0을 출력한다.
예제
2
20
9 31
2 25
2 26
1 27
4 16 0
1 28
2 5
4 9 1
1 6
9 26
7 1
3 12
8 24
4 10 0
3 8
5 24
5 16
6 22
3 8
2 16
25
5 12
4 1 0
9 7
9 29
9 3
4 18 1
4 9 1
3 2
3 27
6 16
4 3 1
5 22
5 6
6 19
4 13 1
9 4
3 15
5 9
3 3
2 0
4 7 1
1 28
3 10
8 28
6 5
Test 1 : 100
Test 2 : 100
출처
comkiwer