很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。
這讓很多學生很反感。
不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。
本題目包含多組測試,請處理到檔案結束。
在每個測試的第一行,有兩個正整數 n 和 m ( 0
學生id編號分別從1編到n。
第二行包含n個整數,代表這n個學生的初始成績,其中第i個數代表id為i的學生的成績。
接下來有m行。每一行有乙個字元 c (只取'q'或'u') ,和兩個正整數a,b。
當c為'q'的時候,表示這是一條詢問操作,它詢問id從a到b(包括a,b)的學生當中,成績最高的是多少。
當c為'u'的時候,表示這是一條更新操作,要求把id為a的學生的成績更改為b。
對於每一次詢問操作,在一行裡面輸最高成績
5 61 2 3 4 5
q 1 5
u 3 6
q 3 4
q 4 5
u 2 9
q 1 5
output5
6 5
9 經典而又基礎的線段樹題目吧!(ps:個人認為)
線段數:
線段樹是一種
二叉搜尋樹,與
區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。
使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。而未優化的
空間複雜度為2n,因此有時需要離散化讓空間壓縮。
線段樹是一種
二叉搜尋樹,與
區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。
對於線段樹中的每乙個非
葉子節點[a,b],它的左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2+1,b]。因此線段樹是
平衡二叉樹,最後的子節點數目為n,即整個線段區間的長度。
ps:鑑於實在不會表達,文中多數話為直接copy的
其實線段樹的原理很好理解,但**的實現確實費了不少功夫!
樹的結構:
truct stree
num[800005];
// 線段樹的**實現靠的是程式的遞迴
樹的建立:
int bulid(int left,int rigth,int node)//從節點最上層遞迴到最下層,最下層即單個數值
mid=(left+rigth)/2;
return num[node].max=mmax(bulid(left,mid,2*node),bulid(mid+1,rigth,2*node+1));//遞迴的公式層層往下遞迴,在往上遞迴
}// mmax 求兩個數較大數的函式
樹的查詢:
int find(int left,int rigth,int node)
}
樹的更新:
void update(int id,int x,int node)
else
}
以上是與本題有關的關於線段樹的**,實際的通用**畢竟要根據題意而改變,所以直接引用
ac**附上:
#include #include int head[200005];
struct stree
num[800005];
// 線段樹的**實現靠的是程式的遞迴
int mmax(int x,int y)
int bulid(int left,int rigth,int node)//從節點最上層遞迴到最下層,最下層即單個數值
mid=(left+rigth)/2;
return num[node].max=mmax(bulid(left,mid,2*node),bulid(mid+1,rigth,2*node+1));//遞迴的公式層層往下遞迴,在往上遞迴
}int find(int left,int rigth,int node)
}void update(int id,int x,int node)
else
}int main()
{ int n,m;
int i,j;
int a,b;
char c;
while(~scanf("%d%d",&n,&m))
{for(i=1;i<=n;i++)
scanf("%d",&head[i]);
bulid(1,n,1);
for(i=0;i
hdu 1754 I Hate It (線段樹版)
讀入的時候因為要先輸入字元c,所以要用getchar 和輸入時的 c處理掉空格,很煩,不按字元輸入而是 s輸入字串可避免這個問題 include include using namespace std define lson l,m,rt 1 define rson m 1,r,rt 1 1 def...
hdu1754 I Hate It 線段樹模板
很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個正整數 n ...
HDU 1754 I Hate It 線段樹模板
本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個正整數 n 和 m 0多組測試,存在單點更新和區間查詢,維護區間最大值,不需要加標記,普通的線段樹模板。include include include include include using namespace std const ...