結果

問題 No.318 学学学学学
ユーザー takakintakakin
提出日時 2020-06-15 23:20:37
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 518 ms / 2,000 ms
コード長 1,446 bytes
コンパイル時間 163 ms
コンパイル使用メモリ 82,404 KB
実行使用メモリ 120,040 KB
最終ジャッジ日時 2024-07-03 11:36:37
合計ジャッジ時間 8,652 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 129 ms
78,956 KB
testcase_01 AC 169 ms
84,040 KB
testcase_02 AC 171 ms
86,644 KB
testcase_03 AC 150 ms
82,056 KB
testcase_04 AC 167 ms
85,160 KB
testcase_05 AC 518 ms
120,040 KB
testcase_06 AC 494 ms
111,956 KB
testcase_07 AC 404 ms
101,944 KB
testcase_08 AC 335 ms
96,456 KB
testcase_09 AC 304 ms
93,072 KB
testcase_10 AC 238 ms
92,344 KB
testcase_11 AC 515 ms
119,940 KB
testcase_12 AC 399 ms
111,988 KB
testcase_13 AC 369 ms
101,604 KB
testcase_14 AC 318 ms
95,468 KB
testcase_15 AC 287 ms
93,100 KB
testcase_16 AC 241 ms
91,820 KB
testcase_17 AC 350 ms
111,936 KB
testcase_18 AC 337 ms
111,948 KB
testcase_19 AC 369 ms
112,068 KB
testcase_20 AC 237 ms
91,832 KB
testcase_21 AC 43 ms
56,124 KB
testcase_22 AC 41 ms
55,224 KB
testcase_23 AC 43 ms
56,052 KB
testcase_24 AC 43 ms
55,944 KB
testcase_25 AC 42 ms
55,300 KB
testcase_26 AC 42 ms
55,052 KB
testcase_27 AC 41 ms
55,424 KB
testcase_28 AC 41 ms
55,140 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys,heapq
input = sys.stdin.buffer.readline
n=int(input())
A=[int(i) for i in input().split()]

LV=(n-1).bit_length()
N0=2**LV
data=[0]*(2*N0)
lazy=[None]*(2*N0)

# 伝搬対象の区間を求める
def gindex(l, r):
  L=(l + N0)>>1; R = (r+N0) >> 1
  lc=0 if l & 1 else (L&-L).bit_length()
  rc=0 if r & 1 else (R&-R).bit_length()
  for i in range(LV):
    if rc<=i:
      yield R
    if L<R and lc<=i:
      yield L
    L>>=1; R>>=1

# 遅延伝搬処理
def propagates(*ids):
  for i in reversed(ids):
    v=lazy[i-1]
    if v is None:
      continue
    lazy[2*i-1]=lazy[2*i]=data[2*i-1]=data[2*i]=v>>1
    lazy[i-1]=None

# 区間[l, r)をxに更新
def update(l, r, x):
  *ids,=gindex(l, r)
  propagates(*ids)

  L=N0+l; R=N0+r
  v=x
  while L<R:
    if R&1:
      R-=1
      lazy[R-1]=data[R-1]=v
    if L & 1:
      lazy[L-1]=data[L-1]=v
      L+=1
    L>>=1; R>>=1; v<<=1
  for i in ids:
    data[i-1]=data[2*i-1]+data[2*i]

# 区間[l, r)内の合計を求める
def query(l, r):
  propagates(*gindex(l, r))
  L=N0+l; R=N0+r

  s=0
  while L<R:
    if R&1:
      R-=1
      s+=data[R-1]
    if L&1:
      s+=data[L-1]
      L+=1
    L>>=1; R>>=1
  return s

import collections
DL=collections.defaultdict(int)
DR=collections.defaultdict(int)
for i,a in enumerate(A):
  if DL[a]==0:
    DL[a]=i+1
  DR[a]=i+1

AA=sorted(list(set(A)))
for a in AA:
  update(DL[a]-1,DR[a],a)
B=[]
for i in range(n):
  B.append(query(i,i+1))
print(*B)
0