結果
問題 | No.318 学学学学学 |
ユーザー |
|
提出日時 | 2022-04-01 22:05:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 951 ms / 2,000 ms |
コード長 | 7,295 bytes |
コンパイル時間 | 489 ms |
コンパイル使用メモリ | 82,224 KB |
実行使用メモリ | 111,080 KB |
最終ジャッジ日時 | 2024-11-20 09:25:23 |
合計ジャッジ時間 | 12,218 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#!/usr/bin/python# -*- coding: utf-8 -*-# importfrom sys import stdin, setrecursionlimitsetrecursionlimit(10**8)# defdef int_map():return map(int,input().split())def int_list():return ['Null']+list(map(int,input().split()))# 整数のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)def int_mtx(N):x = [['Null']+list(map(int, stdin.readline().split())) for _ in range(N)]x.insert(0,['Null'])return x# 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)# AAAAA# BBBBB# CCCCC# のような標準入力を# '0AAAAA'# '0BBBBB'# '0CCCCC'# と受け取るdef str_mtx(N):x = ['0'+stdin.readline()[:-1] for _ in range(N)]x.insert(0,'0')return x# 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)# AAAAA XXXXX# BBBBB YYYYY# CCCCC ZZZZZ# のような標準入力を# [[['0'],[AAAAA],[XXXXX]],# [['0'],[BBBBB],[YYYYY]],# [['0'],[CCCCC],[ZZZZZ]] ]# と受け取るdef str_list(N):x = [['0']+list(map(str, stdin.readline().split())) for _ in range(N)]x.insert(0,['0'])return x# 高さH+1, 幅W+1, のゼロ行列の作成def zero_mtx(H,W):x = [[0]*(W+1) for i in range(H+1)]return x# リストをスペースで分割する(先頭を省く)def print_space(l):return print(" ".join([str(x) for x in l[1:]]))# ゼロインデックスの場合# 整数のリストのリスト:N行のリスト(各行のリストは同じ長さでなくてよい.)def int_mtx_0(N):x = [list(map(int, stdin.readline().split())) for _ in range(N)]return x# ゼロインデックスの場合# 文字のリストのリスト:N+1行のリスト(各行のリストは同じ長さでなくてよい.)def str_mtx_0(N):x = [list(stdin.readline()[:-1]) for _ in range(N)]return x# ゼロインデックスの場合# リストをスペースで分割する(先頭を省かない)def print_space_0(l):return print(" ".join([str(x) for x in l]))# ゼロインデックスの場合# 高さH, 幅W, のゼロ行列の作成def zero_mtx_0(H,W):x = [[0]*W for i in range(H)]return xdef int_list_0():return list(map(int,input().split()))## インポートfrom collections import deque# from collections import defaultdict# 順列に使う# import itertools# 最大公約数などに使う# import math# リストの要素の数をdict形式で# import collections# 二次元配列のコピーを作りたいとき# a_copy = deepcopy(a)# from copy import deepcopy# main codeclass LazySegTree:def __init__(self, initial_data, SegType, UpdateType):if SegType == "min":self.X_f = min; self.X_unit = float('inf')elif SegType == "max":self.X_f = max; self.X_unit = -float('inf')elif SegType == "sum":def segfunc(x, y):return x+yself.X_f = segfunc; self.X_unit = 0elif SegType == "pro":def segfunc(x, y):return x*yself.X_f = segfunc; self.X_unit = 1elif SegType == "xor":def segfunc(x, y):return x^yself.X_f = segfunc; self.X_unit = 0elif SegType == "gcd":from math import gcdself.X_f = gcd; self.X_unit = 0elif SegType == "lcm":from math import gcddef lcm(a,b):return a//gcd(a,b)*bself.X_f = lcm; self.X_unit = 1self.A_unit = Noneself.N = len(initial_data)self.X = [self.X_unit] * (self.N + self.N)self.A = [self.A_unit] * (self.N + self.N)# A_unit = None# (A,*) : 右作用素モノイド A = Z + {A_unit}# 値加算: a*None = a; a*b = a+b# 値代入: a*None = a; a*b = b# 右作用素の二項演算 a*b の定義# X と A の右作用 x@a の定義if UpdateType == "add":self.add_or_set = 1else:self.add_or_set = 0def a_b(a, b): # a*b の定義if a == self.A_unit:return belif b == self.A_unit:return aelse:return self.add_or_set*a + bself.A_f = a_bdef x_a(x, a): # x@a の定義if a == self.A_unit:return xreturn self.add_or_set*x + aself.operate = x_aself.build(initial_data)def leaf(self):return self.X[self.N:]def all_lazy(self):for i in range(self.N):self._propagate_at(i)# for i in range(self.N+1, 2*self.N):# self._eval_at(i)# self.A[i] = self.A_unitdef build(self, seq):for i, x in enumerate(seq, self.N):self.X[i] = xfor i in range(self.N - 1, 0, -1):self.X[i] = self.X_f(self.X[i << 1], self.X[i << 1 | 1])def _eval_at(self, i):return self.operate(self.X[i], self.A[i])def _propagate_at(self, i):self.X[i] = self._eval_at(i)self.A[2*i] = self.A_f(self.A[2*i], self.A[i])self.A[2*i+1] = self.A_f(self.A[2*i+1], self.A[i])self.A[i] = self.A_unitdef _propagate_above(self, i):H = i.bit_length() - 1for h in range(H, 0, -1):self._propagate_at(i >> h)def _recalc_above(self, i):while i > 1:i >>= 1self.X[i] = self.X_f(self._eval_at(i << 1), self._eval_at(i << 1 | 1))def set_val(self, i, x):i += self.Nself._propagate_above(i)self.X[i] = xself.A[i] = self.A_unitself._recalc_above(i)def fold(self, L, R):L += self.NR += self.Nself._propagate_above(L // (L & -L))self._propagate_above(R // (R & -R) - 1)vL = self.X_unitvR = self.X_unitwhile L < R:if L & 1:vL = self.X_f(vL, self._eval_at(L))L += 1if R & 1:R -= 1vR = self.X_f(self._eval_at(R), vR)L >>= 1R >>= 1return self.X_f(vL, vR)def operate_range(self, L, R, x):L += self.NR += self.NL0 = L // (L & -L)R0 = R // (R & -R) - 1self._propagate_above(L0)self._propagate_above(R0)while L < R:if L & 1:self.A[L] = self.A_f(self.A[L], x)L += 1if R & 1:R -= 1self.A[R] = self.A_f(self.A[R], x)L >>= 1R >>= 1self._recalc_above(L0)self._recalc_above(R0)n = int(input())data = int_list_0()from collections import defaultdictd = defaultdict(list)for i,datai in enumerate(data):d[datai].append(i)SegType = "max"UpdateType = "set"seg = LazySegTree(data, SegType, UpdateType)d2 = sorted(d.items())for k,v in d2:seg.operate_range(v[0],v[-1]+1,k)seg.all_lazy()print_space_0(seg.A[n:])