0
0

筆者はレート600前後の茶色コーダ

7月4日に開催されたADTで登場した以下の問題を解いていく

ADTのページ(ALL)

実装コード

解説をみずにとりあえず、セグ木を実装し、候補者番号と票数を載せて値更新を回した
値更新するたびに全区間の集計を入れて表示したらACした。

セグ木の実装は以下を使用した

from collections import defaultdict
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)


class segtree():
    # 略


def segfunc(a,b):
    if a[1] > b[1]:
        return a
    elif a[1] < b[1]:
        return b
    elif a[0] < b[0]:
        return a
    else:
        return b

def main():
    N, M = rLI()
    A = rLI()
    
    e = (N+1,0)
    
    G = segtree([e for _ in range(N+1)],segfunc,e)
    
    d = defaultdict(lambda: -1)
    c = 0
    
    for a in A:
        if d[a] == -1:
            d[a] = c
            c += 1
            G.set(c,(a,0))
        else:
            i = d[a]
            _, n = G.get(i)
            n += 1
            G.set(i,(a,n))
        m, _ = G.all_prod()
        print(m)
        
if __name__ == '__main__':
    main()

ここで解説をみたが、最大値の番号と各候補者の票数だけを管理すればよかったようだ。

from collections import defaultdict
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N, M = rLI()
    A = rLI()
    
    d = defaultdict(lambda: 0)
    m = A[0]
    for a in A:
        d[a] += 1
        if d[a] > d[m] : m = a
        elif d[a] == d[m] : m = min(m,a)
        print(m)
        
if __name__ == '__main__':
    main()

まとめ

ABC329Dを解いた、解法にはセグ木を使用した方法と
最大値の番号と各候補者の票数だけ管理した方法で解いた

感想

解説を見ずに問題を解くことができたのは満足だが、この問題の処理にセグ木は過剰装備だった。
必要最低限のラインを見極めるようにするのが今後の課題である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0