본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 1843 영준이의 숫자 고르기

by 까망 하르방 2021. 5. 23.
반응형

출처: SWEA

Approach

bit 연산을 이용해서 자료를 재배치하는 문제이다.

- 배열 index N은 가장 큰수(마지막수)가 N인 경우의 수이다.

- 전체가 다 들어오고 나서 셈하는 것이 아닌 들어 올때마다 갱신된다.

 

▶ 비트마스크 (Bitmask) 

 

비트마스크 (Bitmask)

비트마스크 정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법 현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현 내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리

zoosso.tistory.com


#include <stdio.h>
#define LL long long

const int MOD = 1000000007;
const int MAX_N = 1e5;
int N, S, TC, srr[MAX_N + 1];
LL card[MAX_N + 1], temp[MAX_N + 1];

void addBit(int idx, LL val)
{
    while (idx <= MAX_N)
    {
        card[idx] += val;
        card[idx] %= MOD;
        idx += (idx & -idx);
    }
}

void init()
{
    for (int i = 0; i < MAX_N + 1; i++)
    {
        card[i] = 0;
    }
    addBit(1, 1);
}

LL sumBit(int idx)
{
    LL sum = 0;
    while (idx > 0)
    {
        sum += card[idx];
        sum %= MOD;
        idx -= (idx & -idx);
    }
    return sum;
}

void input()
{
    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    {
        scanf("%d", &S);
        for (int j = 0; j < S; j++)
        {
            scanf("%d", &srr[j]);
            temp[j] = sumBit(srr[j]) % MOD;
        }
        for (int j = 0; j < S; j++)
        {
            addBit(srr[j], temp[j]);
        }
    }
}

int main()
{
    // freopen("input.txt", "r", stdin);
    scanf("%d", &TC);
    for(int tc = 1; tc <= TC; ++tc)
    {
        init();
        input();
        printf("#%d %lld\n", tc, sumBit(MAX_N));
    }
}

 

반응형

'PS 문제 풀이 > SWEA' 카테고리의 다른 글

[SWEA] 10763 조 신나  (0) 2021.05.23
[SWEA] 1849 영준이의 무게측정  (0) 2021.05.23
[SWEA] 4534 트리 흑백 색칠  (0) 2021.05.22
[SWEA] 9236 곰돌이  (0) 2021.05.22
[SWEA] 4747 사막에서 만난 지니  (0) 2021.05.22

댓글