題目鏈結
思路:今天才入門線段樹,一開始做這題還有一點懵,因為我開始的思路是區間更新時要考慮之前的狀態,比如之前的乙個需要更新的節點是鐵(1),現在再要求更新為鐵(1)則不進行更新.....然後就要分很多情況去討論,很麻煩.....所以另外想了乙個思路:
受懶操作的啟發,我想我能不能定義乙個向下傳遞的值type(傳遞後type歸零),此時向上傳遞的sum仍為左右兩個兒子的和,但sum的更新不再是累加,而是直接等於:區間長度*type的值。
此時詢問區間的和只需要判斷當前區間的type值是否為0,若為0,則說明其type值發生了向下傳遞,也就是說這段區間是由多種材料組成的,所以此時需要繼續向下詢問。若不為0,則說明這段區間的材料相同,所以直接取和即可。
然後....菜鳥成功一次ac。
再一次感受到了演算法的靈活.....
**:
#include using namespace std;
typedef long long ll;
const int maxn = 200005;
struct ptree[maxn*4];
void push_up(int id)
void push_down(int id)
}void creattree(int id,int l,int r)
}void update(int id,int st,int ed,int type)
else
}int findtree(int id,int st,int ed)
else
}int main()
printf("case %d: the total value of the hook is %d.\n",_++,findtree(1,1,n));
} return 0;
}
HDU 1698 線段樹區間更新
之前一直覺得自己線段樹敲得很熟練,然後。某天。是的,就是我的資料結構周開始的時候我發現。我特麼才會單點更新是怎麼回事!只會區間查詢是腫麼回事!摔!恩。就是表達一下弱渣的心情。區間更新,用到延遲操作。延遲操作應該是這麼回事。線段樹的優越性就是體現在,第一是二分查詢,第二是區間操作。當我們需要多次對區間...
hdu1698線段樹(區間更新)
題目鏈結just a hook 乙個鎖鏈,其組成成部分有三種材料,金銀銅,分數為3 2 1,每次可以更換一段的材料,求最後的分數 鉤子最多長100,000 操作最多有100,000次,肯定不能暴力 線段樹 延遲標記lazy 每個節點新增加乙個標記 lazy 每次要更新節點時,不更新到葉節點,記錄這個...
hdu1698 線段樹更新區間
線段樹 更新整個區間 不要一直更新到節點,用乙個標記值 1標記是否雜色。更新的時候如果該段正好是要更新的段則將其更新即可。否則說明要更新的段與當前的tt step 這一段不一致,則要將tt step 這一段拆分成2段,遞迴呼叫更新step 2及step 2 1,更新後tt step 將變成雜色。所以...