๐Ÿšง This website is under construction. ๐Ÿšง
AtCoder
ABC
348
F

ABC
F
bitไธฆๅˆ—ๅŒ–

ABC348 F - Oddly Similar

https://atcoder.jp/contests/abc348/tasks/abc348_f (opens in a new tab)
้’่‰ฒไธŠไฝใ€‚bit ไธฆๅˆ—ๅŒ–ใ€‚

ใพใšๅ‰ๆใจใ—ใฆๆฌกใฎใƒ†ใ‚ฏใƒ‹ใƒƒใ‚ฏใ‚’็Ÿฅใฃใฆใ„ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใ€‚

  • ใ‚ใ‚‹ใ‚‚ใฎใฎๅ€‹ๆ•ฐใฎๅถๅฅ‡ใ‚’ๅ•ใ‚ใ‚Œใ‚‹ๅ•้กŒใฏใ‚ใ–ใ‚ใ–ใ‚ซใ‚ฆใƒณใƒˆใ™ใ‚‹ๅฟ…่ฆใฏใชใใ€้ฉๅฎœ xor ใ‚’ๅ–ใ‚‹ใ ใ‘ใง่‰ฏใ„

    cnt = 0
    for e in iterable:
        if f(e):
            cnt ^= 1
    if cnt == 1:
        print('Oddly!')

ๅ„ๆ•ฐๅˆ— Ai,AjA_i, A_j ใ‚’ๅ€‹ๅˆฅใซใƒใ‚งใƒƒใ‚ฏใ™ใ‚‹ใจ TLE ใซใชใ‚‹ใฎใฏ็›ฎใซ่ฆ‹ใˆใฆใ„ใ‚‹ใฎใง๏ผˆ้ซ˜้€Ÿใช่จ€่ชžใงใฏใใ†ใงใ‚‚ใชใ„ (opens in a new tab)ใ‚‰ใ—ใ„๏ผ‰ใ€ๆ•ฐๅˆ—ใฎๅ„่ฆ็ด ๅŒๅฃซ๏ผˆใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚นๅŒใ˜ใ‚‚ใฎ๏ผ‰ใ‚’ใพใจใ‚ใฆ่จˆ็ฎ—ใ™ใ‚‹ใ“ใจใ‚’่ฉฆใฟใ‚‹ใฎใฏ่‡ช็„ถใช็™บๆƒณใงใ‚ใ‚‹ใ€‚

ใคใพใ‚Šใ€k=1,โ€ฆ,mk=1,\ldots,m ใซๅฏพใ—ใฆใ€ๅ„ Ai,k,Aj,kA_{i,k},A_{j,k} ใŒ็ญ‰ใ—ใ„ใ‚‚ใฎใ‚’ใƒใ‚งใƒƒใ‚ฏใงใใชใ„ใ‹ใจ่€ƒใˆใ‚‹ใ‚ใ‘ใ ใŒใ€ใƒŠใ‚คใƒผใƒ–ใซ่กŒใ†ใจ O(N2)\mathcal{O}(N^2) ใ‹ใ‹ใ‚‹ใŸใ‚ใ€็ตๅฑ€็ทใ˜ใฆ O(N2M)\mathcal{O}(N^2M) ใจใชใ‚Š้–“ใซๅˆใ‚ใชใ„ใ€‚

ใ“ใ“ใงใ€k=1,โ€ฆ,mk=1,\ldots,m ใฎๅ„ใ‚นใƒ†ใƒƒใƒ—ใงใ€Ai,k,Aj,kA_{i,k},A_{j,k} ใŒ็ญ‰ใ—ใใชใ‚‹ใจใ 1 ใซใชใ‚‹ใ‚ˆใ†ใช nร—nn\times{n} ใฎ่กจใ‚’ไฝœๆˆใ™ใ‚‹ใ“ใจใซใ™ใ‚‹ใ€‚

ไพ‹ใˆใฐๅ…ฅๅŠ›ไพ‹ 1 ใซใŠใ„ใฆใ€

3 3
1 2 3
1 3 4
2 3 4

k=1k=1 ใฎๆ™‚ใ€A1,1=1,A2,1=1,A3,1=2A_{1,1}=1,A_{2,1}=1,A_{3,1}=2 ใซใ‚ˆใ‚Šใ€A1,1=A1,1,A1,1=A2,1,A2,1=A2,1,A2,1=A2,2,A3,1=A3,1A_{1,1}=A_{1,1},A_{1,1}=A_{2,1},A_{2,1}=A_{2,1},A_{2,1}=A_{2,2},A_{3,1}=A_{3,1} ใซใ‚ˆใ‚Š่กจใฏๆฌกใฎ้€šใ‚Šใซใชใ‚‹ใ€‚

  • k=1k=1
    i\j123
    1110
    2110
    3001

ๅŒๆง˜ใซใ—ใฆใ€k=2,3k=2,3 ใฎๆ™‚ใฎ่กจใฏใใ‚Œใžใ‚Œใ€

  • k=2k=2

    i\j123
    1100
    2011
    3011
  • k=3k=3

    i\j123
    1100
    2011
    3011

ใจใชใ‚‹ใ€‚ๆœ€็ต‚็š„ใซใ“ใ‚Œใ‚‰ใฎ่กจใ‚’่ถณใ—ๅˆใ‚ใ›ใ‚Œใฐใ€i,ji,j ่ฆ็ด ใŒ AiA_i ใจ AjA_j ใซใคใ„ใฆใ€ Ai,k=Aj,kA_{i,k}=A_{j,k} ใจใชใ‚‹ kk ใฎๅ€‹ๆ•ฐใ‚’่กจใ™ใŸใ‚ใ€ใใ“ใ‹ใ‚‰ๅ€คใŒๅฅ‡ๆ•ฐใจใชใ‚‹ใ‚‚ใฎใฎๅ€‹ๆ•ฐใ‚’ใ‚ซใ‚ฆใƒณใƒˆใ™ใ‚‹ใ“ใจใงๅ•้กŒใซๅ›ž็ญ”ใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ใŒใ€ๅฎŸ้š›ใฎใจใ“ใ‚ใ€ๅ‰่ฟฐใฎใƒ†ใ‚ฏใƒ‹ใƒƒใ‚ฏใฎๅˆฉ็”จใซใ‚ˆใ‚Šใ€่กจๅŒๅฃซใฎๆŽ’ไป–็š„่ซ–็†ๅ’Œใ‚’ๅ–ใ‚‹ใ“ใจใงๅŒใ˜่งฃใ‚’ๅพ—ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚

ใ“ใ“ใงใ€่กŒๅŒๅฃซใฎ่จˆ็ฎ—ใฏ็‹ฌ็ซ‹ใซ่จˆ็ฎ—ใงใใ‚‹ใ“ใจใซๆณจๆ„ใ™ใ‚‹ใ€‚

ใ•ใฆใ€่กจใ‚’็œบใ‚ใ‚‹ใจใ€Ai,k=Aj,kA_{i,k}=A_{j,k} ใจใ—ใฆๅŒใ˜ๅ€คใ‚’ๆŒใคใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น i,ji,j ใฏ ่กจ ใซใŠใ„ใฆใ‚‚่กŒ i,ji,j ๏ผˆใ‚ใ‚‹ใ„ใฏๅˆ— i,ji,j๏ผ‰ใŒ็ญ‰ใ—ใใชใ‚‹ใŸใ‚ใ€Ai,kA_{i,k} ใฎๅ€คใŒ็ญ‰ใ—ใ„ใ‚‚ใฎใ‚’ใพใจใ‚ใฆ่จˆ็ฎ—ใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚ใ•ใ‚‰ใซใ€ใ“ใฎ่กจใฎๅ„่กŒใ‚’ bit ใง็ฎก็†ใ™ใ‚‹ใ€ใคใพใ‚Š Ai,k=Aj,k=xA_{i,k}=A_{j,k}=x ใจใชใ‚‹ๆ™‚ใ€k,xk,x ใซๅฏพใ—ใฆ ii ็•ช็›ฎใจ jj ็•ช็›ฎใŒ็ซ‹ใคใ‚ˆใ†ใช bit ใ‚’็”จๆ„ใ™ใ‚Œใฐใ€ๆฌกใฎๆŽ’ไป–็š„่ซ–็†ๅ’Œใซใ‚ˆใ‚‹่จˆ็ฎ—ใ‚‚้ซ˜้€ŸๅŒ–ใ™ใ‚‹ใ“ใจใŒใงใใ‚‹ใ€‚

ๆๅ‡บใ‚ณใƒผใƒ‰

# -*- coding: utf-8 -*-
 
 
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
 
# mat[i] := mat[i] & 1 << j == 1 ใงใ‚ใ‚Œใฐ A_i ใจ A_j ใฏไผผใฆใ„ใ‚‹
mat = [0] * n
 
for k in range(m):
    # bits[x] := sum(1 << i for i in A_{i,k} = x)
    bits = [0] * 1000
    for i in range(n):
        bits[a[i][k]] |= 1 << i
    for i in range(n):
        mat[i] ^= bits[a[i][k]]
 
ans = 0
 
for i in range(n):
    for j in range(i + 1, n):
        if mat[i] & (1 << j):
            ans += 1
 
print(ans)
 

Python (PyPy 3.10-v7.3.12), 1508 ms (opens in a new tab)