Skip to content

Commit b9544e3

Browse files
authored
Update Readme.md
1 parent 0999d3b commit b9544e3

File tree

1 file changed

+27
-35
lines changed

1 file changed

+27
-35
lines changed

Segment_Tree/715.Range-Module/Readme.md

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -87,46 +87,38 @@ setTree* right;
8787
node = NULL;
8888
}
8989

90-
bool setTracking(int a, int b, bool tracking)
90+
int setStatus(int a, int b, int s)
9191
{
92-
if (a<=begin && end<=b) //如果该区间被包括在了[a,b]内,则整体标记
92+
if (begin>=b || end<=a) // 1. [a,b]与这个区间不相交,返回原先的状态
93+
return status;
94+
if (a<=begin && end<=b) // 2. [a,b]包括了整个区间,将该区间抹平
9395
{
9496
remove(left);
9597
remove(right);
96-
return tracked = tracking;
97-
}
98-
int mid = (end-begin)/2+begin; //如果该区间和[a,b]只是部分相交,则需要往下搜索
99-
if (!left) //如果没有子区间,则需要立即创建.注意子区间的tracked可以完全继承自该区间的tracked
98+
return status = s;
99+
}
100+
if (!left) // 3. [a,b]与该区间相交,需考虑其子树
100101
{
101-
left = new SegTree(begin,mid,tracked);
102-
right = new SegTree(mid,end,tracked);
103-
}
104-
bool leftTracked, rightTracked;
105-
if (a<mid)
106-
leftTracked = left->setTracking(a,b,tracking);
107-
else
108-
leftTracked = left->tracked;
109-
if (b>mid)
110-
rightTracked = right->setTracking(a,b,tracking);
111-
else
112-
rightTracked = right->tracked;
113-
return tracked = leftTracked && rightTracked; // 父区间的tracked,永远来自两个子区间tracked的"与"
102+
int mid = (end-begin)/2+begin;
103+
left = new SegTree(begin,mid,status);
104+
right = new SegTree(mid,end,status);
105+
}
106+
int leftStatus = left->setStatus(a,b,s);
107+
int rightStatus = right->setStatus(a,b,s);
108+
return status = leftStatus && rightStatus;
114109
}
115-
116-
bool getTracking(int a, int b)
117-
{
118-
if (!left && !right) return tracked;
119-
if (a<=begin && end<=b) return tracked;
120-
int mid = (end-begin)/2+begin;
121-
bool leftTracked, rightTracked;
122-
if (a<mid)
123-
leftTracked = left->getTracking(a,b);
124-
else
125-
leftTracked = true;
126-
if (b>mid)
127-
rightTracked = right->getTracking(a,b);
128-
else
129-
rightTracked = true;
130-
return leftTracked && rightTracked;
110+
111+
int getStatus(int a, int b)
112+
{
113+
if (begin>=b || end<=a) // 1. [a,b]与这个区间不相交,返回一个不影响结果的状态
114+
return true;
115+
if (a<=begin && end<=b) // 2. [a,b]包括了整个区间,返回该区间的状态
116+
return status;
117+
if (!left) // 3. [a,b]与该区间相交,但又没有子树,返回整个区间状态
118+
return status;
119+
int mid = (end-begin)/2+begin; // 4. [a,b]与该区间相交,需要考虑其子树
120+
int leftStatus = left->getStatus(a,b);
121+
int rightStatus = right->getStatus(a,b);
122+
return leftStatus && rightStatus;
131123
}
132124
```

0 commit comments

Comments
 (0)