Реализация дерева сегментов, где важен порядок? - PullRequest
0 голосов
/ 15 апреля 2020

Каков наилучший способ реализации дерева сегментов, где важен порядок?

Я храню биты числа в дереве сегментов, теперь возникает проблема, как будто я не могу использовать обычный способ хранение элементов.

Как в: t[i] = t[2*i] + t[2*i+1]

Если я сделаю вышеуказанную реализацию, порядок будет уничтожен.

class SegTree:

    def __init__(self,string):
        self.ln=len(string)
        #list of array where index 0: the value in int 
        #index 1: significance of that number 
        #index 2: no of bits
        self.seg_arr=[[0,-1,1] for i in range(2*self.ln)]
        self.insert(string)
        print(self.seg_arr)

    def insert(self,string):
        for idx in range(self.ln):
            self.seg_arr[self.ln+idx][0]=int(string[idx])
            self.seg_arr[self.ln+idx][1]=idx
        for idx in range(self.ln-1,0,-1):
            left=idx<<1 if self.seg_arr[idx<<1][1]<self.seg_arr[(idx<<1)|1][1] else (idx<<1)|1
            right=idx<<1 if self.seg_arr[idx<<1][1]>self.seg_arr[(idx<<1)|1][1] else (idx<<1)|1
            self.seg_arr[idx][0]=self.seg_arr[left][0]*(2**self.seg_arr[right][2])+self.seg_arr[right][0]
            self.seg_arr[idx][1]=min(self.seg_arr[left][1],self.seg_arr[right][1])
            self.seg_arr[idx][2]=self.seg_arr[left][2]+self.seg_arr[right][2]

    def update(self,idx):
        if self.seg_arr[self.ln+idx-1][0]==1:
            return -1
        self.seg_arr[self.ln+idx-1][0]=1
        idx=self.ln+idx-1
        while(idx>1):
            left=idx if idx&1==0 else idx^1
            right=idx if idx&1==1 else idx^1
            self.seg_arr[idx>>1][0]=self.seg_arr[left][0]*(2**self.seg_arr[right][2])+self.seg_arr[right][0]
            idx>>=1
        print(self.seg_arr)
        return -1

    def query(self,left,right):
        ans=[0,float('inf'),0]
        left+=(self.ln-1)
        right+=self.ln
        while(left<right):
            if (left&1):
                ans[0]+=self.seg_arr[left][0]*(2**ans[2])
                ans[1]=min(self.seg_arr[left][1],ans[1])
                ans[2]+=self.seg_arr[left][2]
                left+=1
            if (right&1):
                right-=1
                ans[0]=ans[0]*(2**self.seg_arr[right][2])+self.seg_arr[right][0]
                ans[1]=min(self.seg_arr[right][1],ans[1])
                ans[2]+=self.seg_arr[right][2]
            left>>=1
            right>>=1
        return ans[0]%3

class Solution:
    def solve(self, A, B):
        s=SegTree(A)
        res=[]
        return res
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...