結果
問題 | No.743 Segments on a Polygon |
ユーザー |
|
提出日時 | 2022-04-01 00:01:46 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 994 ms / 2,000 ms |
コード長 | 2,971 bytes |
コンパイル時間 | 375 ms |
コンパイル使用メモリ | 82,152 KB |
実行使用メモリ | 91,624 KB |
最終ジャッジ日時 | 2024-11-17 18:07:55 |
合計ジャッジ時間 | 11,194 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 10 |
ソースコード
class LazySegTree():#区間和のセグメント木、要素lsdef __init__(self,ls):self.default = 0self.func = (lambda x, y: x + y)self.N = len(ls)self.K = (self.N-1).bit_length()self.N0 = 1 << self.Kself.dat = [self.default]*(2**(self.K+1))self.lazy = [0]*(2**(self.K+1)) #遅延評価for i in range(self.N): #葉の構築self.dat[2**self.K+i] = ls[i]self.build()def build(self):for j in range(self.N0-1,0,-1):self.dat[j] = self.func(self.dat[j<<1],self.dat[j<<1|1]) #親が持つ条件def leafvalue(self,x): #x番目の値を出力return self.query(x,x+1)def update_add(self,x,y): #x番目にyを足すreturn self.updatel_add(x,x+1,y)def gindex(self,l, r): #伝播するインデックス列挙L = l + self.N0; R = r + self.N0lm = (L // (L & -L)) >> 1rm = (R // (R & -R)) >> 1lsindex = []while L < R:if R <= rm:lsindex.append(R)if L <= lm:lsindex.append(L)L >>= 1; R >>= 1while L:lsindex.append(L)L >>= 1return lsindexdef propagates(self,ids):for i in reversed(ids):v = self.lazy[i]if not v:continueself.lazy[i<<1] += v//2; self.lazy[i<<1|1] += v//2self.dat[i<<1] += v//2; self.dat[i<<1|1] += v//2self.lazy[i] = 0def updatel_add(self,l, r, x):#区間にyを足すself.propagates(self.gindex(l, r))L = self.N0 + lR = self.N0 + rii = 0while L < R:if L & 1:self.lazy[L] += x*(2**ii)self.dat[L] += x*(2**ii)L += 1if R & 1:R -= 1self.lazy[R] += x*(2**ii)self.dat[R] += x*(2**ii)L >>= 1R >>= 1ii += 1for i in self.gindex(l, r):self.dat[i] = self.func(self.dat[i<<1],self.dat[i<<1|1])+self.lazy[i]def query(self,l, r):self.propagates(self.gindex(l, r))L = self.N0 + lR = self.N0 + rvL = 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,M = map(int,input().split())ans = 0LSG = LazySegTree([0]*(M))lsab = []for i in range(N):a,b = map(int, input().split())if a > b:a,b = b,alsab.append((a,b))lsab.sort()for i in range(N):a,b = lsab[i]if b-a == 1:continueans += abs(LSG.leafvalue(a)-LSG.leafvalue(b))LSG.updatel_add(a+1, b, 1)print(ans)