페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#3292
인터랙티브

집합 관리 1 3s 128MB

문제

음이 아닌 정수를 원소로 하는 최대 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
로그인해야 코드를 작성할 수 있어요.