https://www.acmicpc.net/problem/15787
비트마스크로 구현하면 되며 vector의 크기를 결정을 잘 해야 한다.
vector<int>d에는 2^1부터 2^20승이 더한 값이 들어갈 수 있으므로 2^21의 크기로 잡아주었다.
| 는 승차, &~는 하차를 의미한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; vector<int>d((1 << 21)); vector<int>train(n+1); int ans = 0; for (int i = 0; i < m; i++) { int u; int a, b;//a번째 기차에서 b번째 좌석 cin >> u; if (u == 1) { cin >> a >> b; train[a] = (train[a] | (1 << b)); } else if (u == 2) { cin >> a >> b; train[a] = (train[a] & ~(1 << b)); } else if(u==3) { cin >> a; if (train[a] & (1 << 20)) train[a] = train[a] & ~(1 << 20); train[a]=train[a] << 1; } else if (u == 4) { cin >> a; train[a] = train[a] >> 1; train[a] = (train[a] & ~(1 << 0)); } } for (int i = 1; i < n+1; i++) { d[train[i]]++; } int len = (1 << 21); for (int i = 0; i < len; i++) { if (d[i]) { ans++; } } cout << ans << '\n'; } | cs |
'알고리즘 > 비트마스크' 카테고리의 다른 글
[B1208] - 부분집합의 합2 (0) | 2018.08.29 |
---|---|
[B1182] - 부분집합의 합 (0) | 2018.08.26 |