[HDU][線段樹]1754.I Hate It,hdu1754.i
思路:
利用線段樹實現,具體參考:[演算法系列之二十三]線段樹(Interval Tree)
代碼
/*---------------------------------------------* 日期:2015-03-24* 作者:SJF0115* 題目: 1754.I Hate It* 來源:HDU* 網址:http://acm.hdu.edu.cn/showproblem.php?pid=1754* 結果:AC* 部落格:-----------------------------------------------*/#include <iostream>#include <cstdio>#include <algorithm>using namespace std;#define Max 200001struct IntervalTreeNode{ int left,right,mid; int weight;};IntervalTreeNode interval[3*Max];// 把當前結點的資訊更新到父結點void PushUp(int num){ // 左右子節點的最大值作為父節點的值 interval[num].weight = max(interval[2*num].weight,interval[2*num+1].weight);}// 建立線段樹void Create(int left,int right,int num,int w[]){ interval[num].left = left; interval[num].right = right; interval[num].mid = left + (right - left) / 2; // 葉子節點 if(left == right){ interval[num].weight = w[left-1]; return; }//if Create(left,interval[num].mid,2*num,w); Create(interval[num].mid+1,right,2*num+1,w); // 把當前結點的資訊更新到父結點 PushUp(num);}// 表示第pos個學生的成績改為scorevoid Update(int pos,int score,int left,int right,int num){ // 葉子節點 if(left == right){ interval[num].weight = score; return; }//if // 左子區間 int mid = interval[num].mid; if(pos <= mid){ Update(pos,score,left,mid,2*num); }//if // 右子區間 else{ Update(pos,score,mid+1,right,2*num+1); } // 子節點修改同時修改父節點 PushUp(num);}// 查詢區間[start,end]int Query(int left,int right,int num){ if(interval[num].left == left && interval[num].right == right){ return interval[num].weight; }//if if(right <= interval[num].mid){ return Query(left,right,2*num); }//if else if(left > interval[num].mid){ return Query(left,right,2*num+1); }//if else{ return max(Query(left,interval[num].mid,2*num),Query(interval[num].mid+1,right,2*num+1)); }//else}int main(){ int N,M,a,b; char op[2]; int score[Max]; while(scanf("%d %d",&N,&M) != EOF){ // 學生 for(int i = 0;i < N;++i){ scanf("%d",&score[i]); }//for // 建立線段樹 Create(1,N,1,score); // 操作 for(int i = 0;i < M;++i){ scanf("%s %d %d",op,&a,&b); if(op[0] == 'Q'){ cout<<Query(a,b,1)<<endl; }//if else if(op[0] == 'U'){ Update(a,b,1,N,1); }//if } }//while return 0;}