๐ ๋ฌธ์
https://www.acmicpc.net/problem/15787
๋ฌธ์
N๊ฐ์ ๊ธฐ์ฐจ๊ฐ ์ด๋ ์ ํค์น๊ณ ์ํ์๋ฅผ ๊ฑด๋๋ ค๊ณ ํ๋ค.
๊ธฐ์ฐจ๋ 20๊ฐ์ ์ผ๋ ฌ๋ก ๋ ์ข์์ด ์๊ณ , ํ ๊ฐ์ ์ข์์๋ ํ ๋ช ์ ์ฌ๋์ด ํ ์ ์๋ค.
๊ธฐ์ฐจ์ ๋ฒํธ๋ฅผ 1๋ฒ๋ถํฐ N๋ฒ์ผ๋ก ๋งค๊ธธ ๋, ์ด๋ ํ ๊ธฐ์ฐจ์ ๋ํ์ฌ M๊ฐ์ ๋ช ๋ น์ด ์ฃผ์ด์ง๋ค.
๋ช ๋ น์ ์ข ๋ฅ๋ 4๊ฐ์ง๋ก ๋ค์๊ณผ ๊ฐ๋ค.
- 1 i x : i๋ฒ์งธ ๊ธฐ์ฐจ์(1 ≤ i ≤ N) x๋ฒ์งธ ์ข์์(1 ≤ x ≤ 20) ์ฌ๋์ ํ์๋ผ. ์ด๋ฏธ ์ฌ๋์ด ํ์๋ค๋ฉด , ์๋ฌด๋ฐ ํ๋์ ํ์ง ์๋๋ค.
- 2 i x : i๋ฒ์งธ ๊ธฐ์ฐจ์ x๋ฒ์งธ ์ข์์ ์์ ์ฌ๋์ ํ์ฐจํ๋ค. ๋ง์ฝ ์๋ฌด๋ ๊ทธ์๋ฆฌ์ ์์์์ง ์์๋ค๋ฉด, ์๋ฌด๋ฐ ํ๋์ ํ์ง ์๋๋ค.
- 3 i : i๋ฒ์งธ ๊ธฐ์ฐจ์ ์์์๋ ์น๊ฐ๋ค์ด ๋ชจ๋ ํ์นธ์ฉ ๋ค๋ก๊ฐ๋ค. k๋ฒ์งธ ์์ ์ฌ๋์ k+1๋ฒ์งธ๋ก ์ด๋ํ์ฌ ์๋๋ค. ๋ง์ฝ 20๋ฒ์งธ ์๋ฆฌ์ ์ฌ๋์ด ์์์์๋ค๋ฉด ๊ทธ ์ฌ๋์ ์ด ๋ช ๋ น ํ์ ํ์ฐจํ๋ค.
- 4 i : i๋ฒ์งธ ๊ธฐ์ฐจ์ ์์์๋ ์น๊ฐ๋ค์ด ๋ชจ๋ ํ์นธ์ฉ ์์ผ๋ก๊ฐ๋ค. k๋ฒ์งธ ์์ ์ฌ๋์ k-1 ๋ฒ์งธ ์๋ฆฌ๋ก ์ด๋ํ์ฌ ์๋๋ค. ๋ง์ฝ 1๋ฒ์งธ ์๋ฆฌ์ ์ฌ๋์ด ์์์์๋ค๋ฉด ๊ทธ ์ฌ๋์ ์ด ๋ช ๋ น ํ์ ํ์ฐจํ๋ค.
M๋ฒ์ ๋ช ๋ น ํ์ 1๋ฒ์งธ ๊ธฐ์ฐจ๋ถํฐ ์์๋๋ก ํ ๊ธฐ์ฐจ์ฉ ์ํ์๋ฅผ ๊ฑด๋๋๋ฐ ์กฐ๊ฑด์ด ์๋ค.
๊ธฐ์ฐจ๋ ์์๋๋ก ์ง๋๊ฐ๋ฉฐ ๊ธฐ์ฐจ๊ฐ ์ง๋๊ฐ ๋ ์น๊ฐ์ด ์์ ์ํ๋ฅผ ๋ชฉ๋ก์ ๊ธฐ๋กํ๋ฉฐ ์ด๋ฏธ ๋ชฉ๋ก์ ์กด์ฌํ๋ ๊ธฐ๋ก์ด๋ผ๋ฉด ํด๋น ๊ธฐ์ฐจ๋ ์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ค.
์๋ฅผ ๋ค๋ฉด, ๋ค์ ๊ทธ๋ฆผ์ ์๋ก ๋ค์์ ๋, 1๋ฒ์งธ ๊ธฐ์ฐจ์ ๊ฐ์ด ์น๊ฐ์ด ์์ ์ํ๋ ๊ธฐ๋ก๋์ง ์์๊ธฐ ๋๋ฌธ์ ์ํ์๋ฅผ ๊ฑด๋ ์์๋ค. 2๋ฒ์งธ ๊ธฐ์ฐจ์ ๊ฐ์ ์ํ๋ ๊ธฐ๋ก๋์ง ์์๊ธฐ ๋๋ฌธ์ 2๋ฒ์งธ ๊ธฐ์ฐจ๋ ์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ค. 3๋ฒ์งธ ๊ธฐ์ฐจ๋ 1๋ฒ์งธ ๊ธฐ์ฐจ์ ์น๊ฐ์ด ์์ ์ํ๊ฐ ๊ฐ์ผ๋ฏ๋ก ์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ค.
์ฒ์์ ์ฃผ์ด์ง๋ ๊ธฐ์ฐจ์๋ ์๋ฌด๋ ์ฌ๋์ด ํ์ง ์๋๋ค.
์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ ๊ธฐ์ฐจ์ ์๋ฅผ ์ถ๋ ฅํ์์ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์ ๊ธฐ์ฐจ์ ์ N(1 ≤ N ≤ 100000)๊ณผ ๋ช ๋ น์ ์ M(1 ≤ M ≤ 100000)๊ฐ ์ฃผ์ด์ง๋ค. ์ดํ ๋ ๋ฒ์งธ ์ค๋ถํฐ M+1๋ฒ์งธ ์ค๊น์ง ๊ฐ ์ค์ ๋ช ๋ น์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ํ์๋ฅผ ๊ฑด๋ ์ ์๋ ๊ธฐ์ฐจ์ ์๋ฅผ ์ถ๋ ฅํ์์ค.
โ๏ธ ํ์ด
์ข์์ ์์น๊ฐ 1๋ถํฐ ์์ํ๋ฏ๋ก, ํธํ ์ธ๋ฑ์ค ์ ๊ทผ์ ์ํด x๋ฒ์งธ ์ข์์ (1<<x)๋ก ํ๋ณํ๋ค.
์ฆ 21๊ฐ์ ์๋ฆฌ์์์ 0๋ฒ์งธ(์ด์ง์ ๋งจ ์ค๋ฅธ์ชฝ)์ ๋ฒ๋ฆฌ๊ณ 1๋ฒ์งธ๋ถํฐ 20๋ฒ์งธ๊น์ง 20๊ฐ๋ฅผ ๋ณด๋ ๊ฒ์ด๋ค.
์ฌ๋์ ํน์ ์์น์ ํ์ฐ๋๊ฑด ๊ทธ ์์น์์ |์ฐ์ฐ, ํน์ ์์น์์ ๋ด๋ฆฌ๋๊ฑด &์ฐ์ฐ์ ํ๋ฉด ๋๋ค.
ํ ์นธ์ฉ ์์ผ๋ก ๊ฐ๊ฑฐ๋ ๋ค๋ก ๊ฐ๋ ๊ฒ์ ์ฌํํธ(<<, >>) ์ฐ์ฐ์ ์ฌ์ฉํ๋ค.
๋ฌธ์ ๋ ๋งจ ๋์ ์์นํ ์ฌ๋๋ค์ด๋ค.
โ๏ธ ๋ค๋ก ๊ฐ๋ ๊ฒฝ์ฐ
โป๏ธ 21๋ฒ์งธ์ ์์นํ ์ฌ๋์ 22๋ฒ์งธ๋ก ๋ฐ๋ฆฌ๊ฒ ๋๋ค.
โป๏ธ (1<<21)์ 1์ 22๋ฒ์งธ ์๋ฆฌ๋ก ๋ฏธ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ 1์ ๋บ (1<<21)-1์ 1์ด 21๊ฐ ๋ชจ์ฌ์๋ ์ด์ง์๊ฐ ๋๋ค.
โป๏ธ ๋ฐ๋ผ์ ๋ ์ด์ง์๋ฅผ & ์ฒ๋ฆฌํ๋ฉด, 22๋ฒ์งธ์ ์๋ ์ฌ๋์ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
โ๏ธ ์์ผ๋ก ๊ฐ๋ ๊ฒฝ์ฐ
โป๏ธ 1๋ฒ์งธ์ ์๋ ์ฌ๋์ ์ข์์ผ๋ก ์น์ง ์๋ 0๋ฒ์งธ๋ก ๋ฐ๋ฆฌ๊ฒ ๋๋ค.
โป๏ธ ~1: 11111111111111111111111111111110 (32์๋ฆฌ)
โป๏ธ ์์ผ๋ก ๋ฏผ ๋ค์ ~1๊ณผ &์ฐ์ฐ์ ํด์ฃผ๋ฉด, ๊ณ์ฐ์์ ์ ์ธ๋์ด์ผ ํ๋ 0๋ฒ์งธ ์ฌ๋์ ์ฌ๋ผ์ง๋ค.
๐โ๏ธ ์๊ฒฌ
๋นํธ๋ง์คํน ๋ค์ ํด๋ณด์๊ณ ๊ณ ๋ฅธ ๋ฌธ์ ....์ฌ์ ํ ์ซ๋ค. ์ปดํจํฐ๊ณตํ์ด์ง๋ง ์ํ์ด ์ซ์ด์ ์ด์ฉ์ง.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
/** https://www.acmicpc.net/problem/15787 */
public class Main_๋ฐฑ์ค_15787_๊ธฐ์ฐจ๊ฐ์ด๋ ์ํค์น๊ณ ์ํ์๋ฅผ_์ค๋ฒ2 {
/*ss
๋์ข์(1<<20) ์ฒซ์ข์(1<<1)
0 0 0 0 0 0 0 0 .... 0 0
20๋ฒ์งธ 1๋ฒ์งธ
*/
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] trains = new int[N+1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int op = Integer.parseInt(st.nextToken());
int tNum = Integer.parseInt(st.nextToken());
int sNum = 0;
switch(op) {
case 1: // ์ฌ๋์ ํ์ด๋ค
sNum = Integer.parseInt(st.nextToken());
trains[tNum] |= (1<<sNum);
break;
case 2: // ํ์ฐจํ๋ค
sNum = Integer.parseInt(st.nextToken());
trains[tNum] &= ~(1<<sNum);
break;
case 3: // ํ์นธ์ฉ ๋ค๋ก
trains[tNum] <<= 1;
//๋งจ ์ผ์ชฝ(21๋ฒ์งธ) ๋นํธ๋ฅผ ์ง์์ค์ผ ํ๋๊น
//๋งจ ์ผ์ชฝ์ 0, 20๋ฒ์งธ~1๋ฒ์งธ๋ ๋ชจ๋ 1๋ก ๋๊ณ &์ฐ์ฐ
trains[tNum] &= ((1<<21)-1);
break;
case 4: // ํ์นธ์ฉ ์์ผ๋ก
trains[tNum] >>= 1;
trains[tNum] &= ~1;
}
}
Set<Integer> set = new HashSet<>();
for (int i = 1; i <= N; i++) {
set.add(trains[i]);
}
System.out.println(set.size());
}//end of main
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ