반응형
출처: SWEA
Approach
bit 연산을 이용해서 자료를 재배치하는 문제이다.
- 배열 index N은 가장 큰수(마지막수)가 N인 경우의 수이다.
- 전체가 다 들어오고 나서 셈하는 것이 아닌 들어 올때마다 갱신된다.
비트마스크 (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 |
댓글