結果

問題 No.318 学学学学学
ユーザー CHOHCOOH2
提出日時 2019-07-16 09:41:06
言語 PyPy3
(7.3.15)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 1,459 bytes
コンパイル時間 158 ms
コンパイル使用メモリ 82,176 KB
実行使用メモリ 88,832 KB
最終ジャッジ日時 2024-11-30 01:31:18
合計ジャッジ時間 6,523 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 3
other RE * 26
権限があれば一括ダウンロードができます

ソースコード

diff #

from collections import defaultdict

#A,B=map(inr,input().split())
#a=list(map(int,input().split()))
from bisect import bisect_left as bl
from bisect import bisect_right as br
from math import log

from fractions import gcd
import sys
input=sys.stdin.readline

N=int(input())
A=list(map(int,input().split()))
n=1
while(n<N):
    n*=2
INF=0
dat=[INF]*(2*n-1)
lazy=[0]*(2*n-1)
def find(a,b,k,l,r):#O()(logn)^2)
    if r<=a or b<=l:
        return INF
    eval(k,l,r)#O(logn)
    if a<=l and r<=b:
        return dat[k]
    else:
        vl=find(a,b,k*2+1,l,(l+r)//2)
        vr=find(a,b,k*2+2,(l+r)//2,r)
        return vl+vr
def eval(k,l,r):
    if lazy[k]!=0:#遅延配列が0かどうか
        dat[k]=lazy[k]
        if r-l>1:#最下段かのチェック
            lazy[2*k+1]=lazy[k]//2
            lazy[2*k+2]=lazy[k]//2
        lazy[k]=0#伝搬終了
def add(a,b,x,k,l,r):
    eval(k,l,r)
    if b<=l or r<=a:
        return
    if a<=l and r<=b:
        lazy[k]+=(r-l)*x
        eval(k,l,r)
    else:
        add(a,b,x,2*k+1,l,(l+r)//2)
        add(a,b,x,2*k+2,(l+r)//2,r)
        dat[k]=dat[2*k+1]+dat[2*k+2]
dict1=defaultdict(int)
dict2=defaultdict(int)
for i in range(N):
    if not(dict1[A[i]]):
        dict1[A[i]]=i+1
    if not(dict2[A[N-1-i]]):
        dict2[A[N-1-i]]=N-i
key=list(dict1.keys())
key.sort()
for i in key:
    s=dict1[i]-1
    t=dict2[i]-1
    add(s,t+1,i,0,0,n)
for i in range(N):
    print(find(i,i+1,0,0,n),end=" ")
print()
0