1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class SegmentTree: def __init__(self,n): self.tree=[0]*(4*n) def add(self,o,l,r,idx,val): if l==r: self.tree[o]=val return mid=(l+r)>>1 if idx<=mid: self.add(o*2,l,mid,idx,val) else: self.add(o*2+1,mid+1,r,idx,val) self.tree[o]=max(self.tree[o*2],self.tree[o*2+1]) def query(self,o,l,r,L,R): if L<=l and R>=r: return self.tree[o] res=-1 mid=(l+r)>>1 if L<=mid: res=max(res,self.query(o*2,l,mid,L,R)) if R>mid: res=max(res,self.query(o*2+1,mid+1,r,L,R)) return res
n,D,r=RR() nums=RR()
f=[0]*n
h=[(x,i) for i,x in enumerate(nums)] h.sort() t=SegmentTree(n)
d=deque()
for i in range(n): t.add(1,0,n-1,i,-1)
idx=0 for hi,i in h: while d and hi-d[0][0]>=D: x,j,res=d.popleft() t.add(1,0,n-1,j,res) mx=t.query(1,0,n-1,max(0,i-r),min(n-1,i+r)) f[idx]=mx+1 d.append((hi,i,f[idx])) idx+=1 print(max(f))
|