Каков наилучший способ реализации дерева сегментов, где важен порядок?
Я храню биты числа в дереве сегментов, теперь возникает проблема, как будто я не могу использовать обычный способ хранение элементов.
Как в: 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