Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit acee620

Browse files
fixed segment_tree_custom_merge_function
1 parent 3ee6d4c commit acee620

File tree

2 files changed

+29
-32
lines changed

2 files changed

+29
-32
lines changed

‎src/segment_tree_custom_merge_function.cpp

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
2-
* Description: Segment Tree with custom merge function.
3-
* Usage: construct O(N), query O(lg(N)), update O(lg(N))
4-
* Source: https://github.com/dragonslayerx
2+
* Description: Segment Tree with custom merge function.
3+
* Usage: construct O(N), query O(lg(N)), update O(lg(N))
4+
* Source: https://github.com/dragonslayerx
55
*/
66

77
#include <iostream>
@@ -18,20 +18,23 @@ struct node {
1818
sum = prefix = suffix = 0;
1919
maxs = INF;
2020
}
21-
node(int a, int b, int c, int d) {
22-
assign(a, b, c, d);
21+
22+
node(int sum, int maxs, int prefix, int suffix) {
23+
setNode(sum, maxs, prefix, suffix);
2324
}
24-
void assign(int a, int b, int c, int d)
25-
{
26-
sum = a, maxs = b, prefix = c, suffix = d;
25+
26+
void setNode(int sum, int maxs, int prefix, int suffix){
27+
this->sum =sum;
28+
this->maxs=maxs;
29+
this->prefix=prefix;
30+
this->suffix=suffix;
2731
}
2832
};
2933

3034
int a[MAX];
3135
node st[4*MAX];
3236

33-
node merge(node left, node right)
34-
{
37+
node merge(node left, node right){
3538
node t;
3639
t.prefix = max(left.prefix, left.sum+right.prefix);
3740
t.suffix = max(right.suffix, right.sum+left.suffix);
@@ -42,10 +45,9 @@ node merge(node left, node right)
4245
return t;
4346
}
4447

45-
node construct(int n, int ll, int rl)
46-
{
48+
node construct(int n, int ll, int rl){
4749
if (ll == rl) {
48-
st[n].assign(a[ll], a[ll], a[ll], a[ll]);
50+
st[n].setNode(a[ll], a[ll], a[ll], a[ll]);
4951
} else {
5052
node left = construct(2*n+1, ll, (ll+rl)/2);
5153
node right = construct(2*n+2, (ll+rl)/2+1, rl);
@@ -54,10 +56,9 @@ node construct(int n, int ll, int rl)
5456
return st[n];
5557
}
5658

57-
node query(int n, int ll, int rl, int x, int y)
58-
{
59+
node query(int n, int ll, int rl, int x, int y){
5960
int mid = (ll+rl)/2;
60-
if (x == ll && y == rl) return st[n];
61+
if (x==ll && y==rl) return st[n];
6162
else if (y <= mid) return query(2*n+1, ll, mid, x, y);
6263
else if (x > mid) return query(2*n+2, mid+1, rl, x, y);
6364
else {
@@ -67,16 +68,15 @@ node query(int n, int ll, int rl, int x, int y)
6768
}
6869
}
6970

70-
node update(int n, int ll, int rl, int x, int color)
71-
{
72-
if (x < ll || x > rl) return st[n];
73-
if (x == ll && x == rl) {
74-
st[n].assign(//--Do everything Here--//);
71+
node update(int n, int ll, int rl, int p, int val){
72+
if (p < ll || p > rl) return st[n];
73+
if (p == ll && p == rl) {
74+
st[n].setNode(val, val, val, val);
7575
return st[n];
7676
} else {
7777
int mid = (ll+rl)/2;
78-
node left = update(2*n+1, ll, (ll+rl)/2, x, color);
79-
node right = update(2*n+2, (ll+rl)/2+1, rl, x, color);
78+
node left = update(2*n+1, ll, (ll+rl)/2, p, val);
79+
node right = update(2*n+2, (ll+rl)/2+1, rl, p, val);
8080
st[n] = merge(left, right);
8181
}
8282
return st[n];
@@ -86,8 +86,7 @@ int main()
8686
{
8787
int n;
8888
scanf("%d", &n);
89-
for (int i = 0; i < n; i++)
90-
scanf("%d", a+i);
89+
for (int i = 0; i < n; i++) scanf("%d", a+i);
9190
construct(0, 0, n-1);
9291
int q;
9392
scanf("%d", &q);

‎src/segment_tree_range_query_point_update.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
2-
* Description: Segment Tree Range query Point update.
3-
* Usage: construct O(N), update O(lg(N)), query O(lg(N))
4-
* Source: https://github.com/dragonslayerx
2+
* Description: Segment Tree Range query Point update.
3+
* Usage: construct O(N), update O(lg(N)), query O(lg(N))
4+
* Source: https://github.com/dragonslayerx
55
*/
66

77
#include <iostream>
@@ -17,8 +17,7 @@ long long a[MAX];
1717
int st[4*MAX];
1818

1919
int construct (int node, int ll, int rl){
20-
if (ll == rl)
21-
st[node] = a[ll];
20+
if (ll == rl) st[node] = a[ll];
2221
else {
2322
int left = construct(2*node+1, ll, (ll+rl)/2);
2423
int right = construct(2*node+2, (ll+rl)/2 + 1, rl);
@@ -35,8 +34,7 @@ int query(int node, int ll, int rl, int ql, int qr){
3534
return left + right;
3635
}
3736

38-
int update(int node, int ll, int rl, int q, int val)
39-
{
37+
int update(int node, int ll, int rl, int q, int val){
4038
if (rl < q || ll > q) return st[node];
4139
if (q == ll && q == rl) st[node] = val;
4240
else {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /