結果
問題 | No.742 にゃんにゃんにゃん 猫の挨拶 |
ユーザー |
|
提出日時 | 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 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 16 |
ソースコード
import sysimport mathsys.setrecursionlimit(10**7)class segki():#modeで関数を選べます。(min,max,sum,prd(product),gcd,lmc,^,&,|)def __init__(self,N,ls,mode='min'): #葉の数N,要素lsself.mode = modeself.default = self.setdef()self.N = Nself.K = (N-1).bit_length()self.N2 = 1 << self.Kself.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 << 60elif self.mode == 'max':return -(1 << 60)elif self.mode == 'sum':return 0elif self.mode == 'prd':return 1elif self.mode == 'gcd':return 0elif self.mode == 'lmc':return 1elif self.mode == '^':return 0elif self.mode == '&':return (1 << 60)-1elif self.mode == '|':return 0def 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+yelif self.mode == 'prd': return x*yelif self.mode == 'gcd': return math.gcd(x,y)elif self.mode == 'lmc': return (x*y)//math.gcd(x,y)elif self.mode == '^': return x^yelif self.mode == '&': return x&yelif self.mode == '|': return x|ydef leafvalue(self,x):return self.dat[x+self.N2]def update(self,x,y): #index(x)をyに変更i = x+self.N2self.dat[i] = ywhile (i>0): #親の値を変更i >>= 1self.dat[i] = self.func(self.dat[i<<1],self.dat[i<<1|1])returndef query(self,L,R): # [L,R)の区間取得L += self.N2R += self.N2vL = self.defaultvR = self.defaultwhile L < R:if L & 1:vL = self.func(vL,self.dat[L])L += 1if R & 1:R -= 1vR = self.func(self.dat[R],vR)L >>= 1R >>= 1return 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 = 0for i in range(N):m = SG.query(1,ls[i])ans += mSG.update(ls[i],0)print(ans)