バイトの競プロメモ

主に競技プログラミング

AtCoder Regular Contest 160

C - Power Up

 

メモ

1 ~ 2*10^5 の整数がN個ある時に

xという整数を二つ消して、x+1を一つ作れる

この時集合としてあり得るものの数え上げをしろという問題

 

dp[a][x] := aより前までについての繰り上がり処理を終えた際に、aに対する繰り上がりがxであるような状態の場合の数

 

として遷移することが思いつくが、dpの状態数のオーダーが分からなかった

よく考えると、この状態数は

aiをaの個数として

操作中になり得る、最大のaiをSaiとしたときに

sigma(Sai)になる

 

ここでai(個数)が全体に寄与する量を考えると

ai, ai/2, ai/4, ....と右に行くにつれて半分になっていき

1+1/2+1/4+.... == 2であることから

aiが全体に寄与する量は O(ai)である

よって全体の合計もO(sigma(ai)) = O(N)

 

aiが寄与する量は