結果
問題 | No.742 にゃんにゃんにゃん 猫の挨拶 |
ユーザー | kohei2019 |
提出日時 | 2022-03-31 23:47:07 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 123 ms / 2,500 ms |
コード長 | 2,472 bytes |
コンパイル時間 | 303 ms |
コンパイル使用メモリ | 81,984 KB |
実行使用メモリ | 79,096 KB |
最終ジャッジ日時 | 2024-11-17 17:42:08 |
合計ジャッジ時間 | 1,884 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 41 ms
52,736 KB |
testcase_01 | AC | 39 ms
52,948 KB |
testcase_02 | AC | 39 ms
52,616 KB |
testcase_03 | AC | 38 ms
52,608 KB |
testcase_04 | AC | 45 ms
58,496 KB |
testcase_05 | AC | 52 ms
62,848 KB |
testcase_06 | AC | 63 ms
68,096 KB |
testcase_07 | AC | 87 ms
76,744 KB |
testcase_08 | AC | 96 ms
76,804 KB |
testcase_09 | AC | 39 ms
52,480 KB |
testcase_10 | AC | 40 ms
52,480 KB |
testcase_11 | AC | 123 ms
79,096 KB |
testcase_12 | AC | 114 ms
78,592 KB |
testcase_13 | AC | 39 ms
52,480 KB |
testcase_14 | AC | 38 ms
52,480 KB |
testcase_15 | AC | 39 ms
52,480 KB |
ソースコード
import sys import math sys.setrecursionlimit(10**7) class segki(): #modeで関数を選べます。(min,max,sum,prd(product),gcd,lmc,^,&,|) def __init__(self,N,ls,mode='min'): #葉の数N,要素ls self.mode = mode self.default = self.setdef() self.N = N self.K = (N-1).bit_length() self.N2 = 1 << self.K self.dat = [self.default]*(2**(self.K+1)) for i in range(self.N): #葉の構築 self.dat[self.N2+i] = ls[i] self.build() def setdef(self): if self.mode == 'min':return 1 << 60 elif self.mode == 'max':return -(1 << 60) elif self.mode == 'sum':return 0 elif self.mode == 'prd':return 1 elif self.mode == 'gcd':return 0 elif self.mode == 'lmc':return 1 elif self.mode == '^':return 0 elif self.mode == '&':return (1 << 60)-1 elif self.mode == '|':return 0 def build(self): for j in range(self.N2-1,-1,-1): self.dat[j] = self.func(self.dat[j<<1],self.dat[j<<1|1]) #親が持つ条件 def func(self,x,y):#関数を指定 if self.mode == 'min': return min(x,y) elif self.mode == 'max': return max(x,y) elif self.mode == 'sum': return x+y elif self.mode == 'prd': return x*y elif self.mode == 'gcd': return math.gcd(x,y) elif self.mode == 'lmc': return (x*y)//math.gcd(x,y) elif self.mode == '^': return x^y elif self.mode == '&': return x&y elif self.mode == '|': return x|y def leafvalue(self,x): return self.dat[x+self.N2] def update(self,x,y): #index(x)をyに変更 i = x+self.N2 self.dat[i] = y while (i>0): #親の値を変更 i >>= 1 self.dat[i] = self.func(self.dat[i<<1],self.dat[i<<1|1]) return def query(self,L,R): # [L,R)の区間取得 L += self.N2 R += self.N2 vL = self.default vR = self.default while L < R: if L & 1: vL = self.func(vL,self.dat[L]) L += 1 if R & 1: R -= 1 vR = self.func(self.dat[R],vR) L >>= 1 R >>= 1 return self.func(vL,vR) N = int(input()) ls = [int(input()) for i in range(N)] SG = segki(N+1,[1]*(N+1),mode='sum') ans = 0 for i in range(N): m = SG.query(1,ls[i]) ans += m SG.update(ls[i],0) print(ans)