結果
問題 | No.318 学学学学学 |
ユーザー | SI1000-github |
提出日時 | 2022-04-01 22:09:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 958 ms / 2,000 ms |
コード長 | 7,305 bytes |
コンパイル時間 | 156 ms |
コンパイル使用メモリ | 82,196 KB |
実行使用メモリ | 111,168 KB |
最終ジャッジ日時 | 2024-11-20 09:34:04 |
合計ジャッジ時間 | 11,825 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 189 ms
80,784 KB |
testcase_01 | AC | 261 ms
82,932 KB |
testcase_02 | AC | 308 ms
84,976 KB |
testcase_03 | AC | 227 ms
82,484 KB |
testcase_04 | AC | 275 ms
84,096 KB |
testcase_05 | AC | 898 ms
111,104 KB |
testcase_06 | AC | 726 ms
103,064 KB |
testcase_07 | AC | 593 ms
98,012 KB |
testcase_08 | AC | 460 ms
95,232 KB |
testcase_09 | AC | 374 ms
94,464 KB |
testcase_10 | AC | 222 ms
92,272 KB |
testcase_11 | AC | 958 ms
111,168 KB |
testcase_12 | AC | 668 ms
99,372 KB |
testcase_13 | AC | 555 ms
97,016 KB |
testcase_14 | AC | 452 ms
93,308 KB |
testcase_15 | AC | 368 ms
92,892 KB |
testcase_16 | AC | 227 ms
92,160 KB |
testcase_17 | AC | 486 ms
99,804 KB |
testcase_18 | AC | 438 ms
99,388 KB |
testcase_19 | AC | 410 ms
99,968 KB |
testcase_20 | AC | 247 ms
94,976 KB |
testcase_21 | AC | 46 ms
55,296 KB |
testcase_22 | AC | 45 ms
54,528 KB |
testcase_23 | AC | 45 ms
55,040 KB |
testcase_24 | AC | 45 ms
55,168 KB |
testcase_25 | AC | 46 ms
54,784 KB |
testcase_26 | AC | 45 ms
55,424 KB |
testcase_27 | AC | 45 ms
54,912 KB |
testcase_28 | AC | 46 ms
55,040 KB |
ソースコード
#!/usr/bin/python # -*- coding: utf-8 -*- # import from sys import stdin, setrecursionlimit setrecursionlimit(10**8) # def def 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 x def 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 code class 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+y self.X_f = segfunc; self.X_unit = 0 elif SegType == "pro": def segfunc(x, y): return x*y self.X_f = segfunc; self.X_unit = 1 elif SegType == "xor": def segfunc(x, y): return x^y self.X_f = segfunc; self.X_unit = 0 elif SegType == "gcd": from math import gcd self.X_f = gcd; self.X_unit = 0 elif SegType == "lcm": from math import gcd def lcm(a,b): return a//gcd(a,b)*b self.X_f = lcm; self.X_unit = 1 self.A_unit = None self.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 = 1 else: self.add_or_set = 0 def a_b(a, b): # a*b の定義 if a == self.A_unit: return b elif b == self.A_unit: return a else: return self.add_or_set*a + b self.A_f = a_b def x_a(x, a): # x@a の定義 if a == self.A_unit: return x return self.add_or_set*x + a self.operate = x_a self.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.X[i] = self._eval_at(i) self.A[i] = self.A_unit def build(self, seq): for i, x in enumerate(seq, self.N): self.X[i] = x for 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_unit def _propagate_above(self, i): H = i.bit_length() - 1 for h in range(H, 0, -1): self._propagate_at(i >> h) def _recalc_above(self, i): while i > 1: i >>= 1 self.X[i] = self.X_f(self._eval_at(i << 1), self._eval_at(i << 1 | 1)) def set_val(self, i, x): i += self.N self._propagate_above(i) self.X[i] = x self.A[i] = self.A_unit self._recalc_above(i) def fold(self, L, R): L += self.N R += self.N self._propagate_above(L // (L & -L)) self._propagate_above(R // (R & -R) - 1) vL = self.X_unit vR = self.X_unit while L < R: if L & 1: vL = self.X_f(vL, self._eval_at(L)) L += 1 if R & 1: R -= 1 vR = self.X_f(self._eval_at(R), vR) L >>= 1 R >>= 1 return self.X_f(vL, vR) def operate_range(self, L, R, x): L += self.N R += self.N L0 = L // (L & -L) R0 = R // (R & -R) - 1 self._propagate_above(L0) self._propagate_above(R0) while L < R: if L & 1: self.A[L] = self.A_f(self.A[L], x) L += 1 if R & 1: R -= 1 self.A[R] = self.A_f(self.A[R], x) L >>= 1 R >>= 1 self._recalc_above(L0) self._recalc_above(R0) n = int(input()) data = int_list_0() from collections import defaultdict d = 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.leaf())