處理何種問題:陣列單點更新,單點查詢,區間更新,區間求和,區間求最值。
效能:時間複雜度為o(logn)
原理:區間跟新的懶惰標記了解一下,其餘略
實現步驟:略
線段樹的區間求最值差別不大,在此貼乙份a過題的最值**,用來對比找bug。
#include#include#include#includeusing namespace std;const int maxn=200010;
struct node
;node tree[maxn*4];
int num[maxn];
int n,ctor,x,ans,a,b,y;
void built(int k,int ll,int rr)
else
} void change_point(int k)
else
}void ask_interval(int k)
else
} int main()
else if(c=='u')//單點更新}}
return 0;
}
輸入樣例解釋:
9//n個元素
1 2 3 4 5 6 7 8 9
1 5//單點查詢為1,x為座標,從1開始計數
2 5 0//單點修改為2,x為座標,y為更新值,
3 1 5//區間查詢為3,查詢[a,b]區間內的元素和,
4 1 5 10//區間更新為4,將[a,b]區間內的元素均加y
輸出樣例解釋:
5 //對於1的操作
10//對於3的操作輸出
#include#include#include#includeusing namespace std;const int maxn=100010;
struct node
;node tree[maxn*4];
int num[maxn];//原序列
int n,ctor,x,ans,a,b,y;//元素個數,建樹是計數變數,單點查詢時位置,左區間,右區間,區間修改值
void built(int k,int ll,int rr)//建樹
else
}void down(int k)//懶惰標記
void ask_point(int k)//單點查詢
else
}void change_point(int k)//單點更新
else
}void ask_interval(int k)//區間查詢
else
}void change_interval(int k)//區間更新
else
}int main()
else if(q==2)//單點更新
else if(q==3)//區間查詢
else if(q==4)//區間更新}}
return 0;
}
線段樹基本操作(1)
建樹,查詢和單點修改 把一段長度為2 k的區間逐次對半分,可以總共分成2 k 1 1各節點,變成了一棵二叉樹 對於區間 lt,rt 它的子節點為區間 lt,mid 和區間 mid 1,rt 查詢時只要要查詢的區間的左右邊界剛好等於已知區間的邊界,就可以返回值了,不需要一搜到底 對於單點修改,基本上和...
線段樹基本操作(2)
假如指定乙個操作給一段區間的所有值加2,求任意區間的最小值 更新 才發現在change是就更改結點值而查詢時只釋放結點會更快,下面摘自網上 對於任意區間的修改,我們先按照查詢的方式將其劃分成線段樹中的結點,然後修改這些結點的資訊,並給這些結點標上代表這種修改操作的標記。在修改和查詢的時候,如果我們到...
線段樹的基本操作
點更新 1 include 點更新2 include 3 include 4 5using namespace std 67 const int n 10000 8 intn,m,a n 9struct node 10tree 4 n 1415 void build int id,int l,int...