''' mbinary ######################################################################### # File : loserTree.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-05-19 23:06 # Description: ######################################################################### ''' from winnerTree import winnerTree class loserTree: '''if i<=lowExt p = (i+offset)//2 else p = (i+n-1-lowExt)//2 s is the num of the full subtree node p is the index of tree i is the index of players offset is a num 2^k-1 just bigger than n lowExt is the double node num of the lowest layer of the tree ''' def __init__(self,players,reverse=False): self.n=len(players) self.tree = [0]*self.n players.insert(0,0) self.players=players self.reverse=reverse self.getNum() self.tree[0] = self.initTree(1) self.dir=None def getNum(self): i=1 while 2*i< self.n:i=i*2 if 2*i ==self. n: self.lowExt=0 self.s = 2*i-1 else: self.lowExt = (self.n-i)*2 self.s = i-1 self.offset = 2*i-1 def treeToArray(self,p): return 2*p-self.offset if p>self.s else 2*p+self.lowExt-self.n+1 def arrayToTree(self,i): return (i+self.offset)//2 if i<=self.lowExt else (i-self.lowExt+ self.n-1)//2 def win(self,a,b): return ab def initTree(self,p): if p>=self.n: delta = p%2 #!!! good job notice delta mark the lchild or rchlid return self.players[self.treeToArray(p//2)+delta] l = self.initTree(2*p) r = self.initTree(2*p+1) if self.win(r,l): self.tree[p] = l self.dir = 'r' return r else : self.tree[p] = r self.dir = 'l' return l def getWinIdx(self,idx=1): while 2*idx