線段樹應該是資料結構中的一種吧,說白了,他就是一種工具,只要你學會了他,那麼你就可以在以後的學習中去用它。
他的大致用法,就是把乙個一維陣列改變成乙個樹的結構,而且這個樹還是乙個完全二叉樹;
上述圖就是把乙個1-8的區間變成了乙個二叉樹的結構,為什麼我們要這樣幹呢?這怎麼說呢?其實我也說不清楚。因為能力有限嗎?下面我們就通過例題來體會線段樹的魅力所在吧。
很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這題的大概意思就是說,給你乙個一維陣列,然後會有兩個操作,第乙個操作是給你乙個區間,你把這個區間的最值給輸出出來,還有乙個操作給你乙個一維陣列的位置,你要改變這個值:這讓很多學生很反感。
不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。
input
本題目包含多組測試,請處理到檔案結束。
在每個測試的第一行,有兩個正整數 n 和 m ( 0output
對於每一次詢問操作,在一行裡面輸出最高成績。
sample input
5 6sample output1 2 3 4 5
q 1 5
u 3 6
q 3 4
q 4 5
u 2 9
q 1 5
565hint9
huge input,the c function scanf() will work better than cin
這個題我們應該怎麼做呢?如果用正常的方法,修改很簡單,但是再求最值的時候,首先我們肯定是不能排序的,那麼我們就要在所給的區間中乙個乙個的去比較,最終找到最大的值,那麼這個復咋讀是多少呢?我們來算一下。0這題的複雜度就是n*m,大概就是1e9,那肯定是超時了啊,看來正常的方法根本行不通,那麼我們該怎麼辦呢?這就輪到線段樹出馬了,下面給出ac**,並附上詳細的講解;
#include#include#includeusing namespace std;
const int maxn=2*1e5+7;
int a[maxn];
struct stu
a[maxn*4];//構建線段樹的節點,每個節點包含左右的邊界和值;
void build_tree(int x,int y,int i)//線段樹的建造;
//如果左邊的邊界等於右邊的邊界,就相當於找到了這棵樹的最下面,這個時候就可以賦值了;
int mid=(x+y)/2;//如果沒有找到最下面那麼就接著往下找,找的時候分成左邊的節點和右邊的節點;
build_tree(x,mid,2*i);
build_tree(mid+1,y,2*i+1);
a[i].date=max(a[i*2].date,a[i*2+1].date);//除了最下面的那個節點,其他的每個節點的值都是有他下面的兩個節點得到的
}void g(int q,int val,int i)//對線段樹的維護,說白了就是說根據題目的要求去改變樹的值;
//如果找到了那個點,就把他的值改變;
int mid=(a[i].l+a[i].r)/2;
if(q<=mid)
g(q,val,i*2);
if(q>mid)
g(q,val,2*i+1); //如果找不到,那麼就去此時中間點的值,然後取判斷是要從右邊找這個點還是要從左邊找;
a[i].date=max(a[i*2].date,a[i*2+1].date);//找到之後也要把這個節點上面的所有的點全部更新;
}int c(int x,int y,int i)
{ if(a[i].l>=x&&a[i].r<=y)//如果此時節點的左右邊界被所求區間所包含那麼就返回此時節點的值;
return a[i].date;
int mid=(a[i].l+a[i].r)/2;
if(mid>=y)
return c(x,y,i*2);
else if(mid其實線段樹主要的就是有是三個吧!首先我們要先建造乙個線段樹,然後就是對線段樹值的修改,最後我們要輸出啊,所以我們要增加乙個詢問,就是查詢輸出的意思,只要我們把這三個函式寫好之後,那麼這個線段數基本上算是完成了。
線段樹單點更新
hdu 1166 單點更新,求區間和 第一次寫線段樹,照著大神的抄了一遍 include include include define max 50100 define mid l r 1 define lson l,m,rt 1 define rson m 1,r,rt 1 1 using nam...
線段樹(單點更新)
1.hdu 1166 敵兵布陣 單點更新,區間求和,最裸的線段樹 include include include using namespace std define maxn 50010 define lson l,m,rt 1 define rson m 1,r,rt 1 1 struct tr...
線段樹單點更新
g 梔子花開 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 1921 description 這是乙個梔子花開的季節,也是乙個離別的季節,四年一千多個日日夜夜,那校園...