참고자료
https://www.geeksforgeeks.org/c-bitset-and-its-application/
전에 문제에서 bitset을 사용해서 문제를 풀었는데 long long int로 사용해서 최대 64개의 원소만 다룰 수 있었다.
bitset 클래스를 사용하면 좀 더 넓은 범위를 사용할 수 있다.
int main ()
{
std::bitset<16> foo;
std::bitset<16> bar (0xfa2);
std::bitset<16> baz (std::string("0101111001"));
std::cout << "foo: " << foo << '\n';
std::cout << "bar: " << bar << '\n';
std::cout << "baz: " << baz << '\n';
return 0;
}
<16> : 이게 비트맵의 사이즈인듯
64bit 저장하고 싶으면 bitset<64>로 만들면 되겠다
std::bitset<16> baz (std::string("0101111001"));
이렇게 문자열로 초기화 가능하구나
set8[1] = 1; // 00000010
set8[4] = set8[1]; // 00010010
// bset.set(pos, b) makes bset[pos] = b
cout << set8.set(4, 0) << endl;
오! 이렇게 하나하나 설정이 가능하구나 and로 끙끙대며 하나씩 안 바꿔도 되겠다
cout << set8.flip(2) << endl;
cout << set8.flip() << endl;
헉 이것봐 flip도 가능
비트셋 백터 만들기, OR 연산 |=
vector<bitset<2005> > lamp(n);
for (int i = 0; i < n; i++) {
int num;
scanf("%d", &num);
for (int j = 0; j < num; j++) {
int input;
scanf("%d", &input);
lamp[i][input] = 1;
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
bitset<2005> check;
for (int j = 0; j < n; j++) {
if (i == j)
continue;
check |= lamp[j];
}
bool isTrue = true;
for (int i = 1; i <= m; i++) {
if (check[i] == 0)
isTrue = false;
}
if (isTrue) {
ans = 1;
break;
}
}
'공부합시다' 카테고리의 다른 글
비트마스크로 부분집합 관리 (0) | 2020.09.21 |
---|---|
거듭 제곱 빠른 계산 (0) | 2020.09.19 |
점 3개의 방향성을 나타내는 CCW (0) | 2020.09.01 |
소수 판별법 - 에라토스테네스의 체 (0) | 2020.08.04 |
조합 수 구하기 (0) | 2020.07.19 |