HDU 1698 線段樹區間更新

2021-07-02 17:20:44 字數 1172 閱讀 7864

之前一直覺得自己線段樹敲得很熟練,然後。。。某天。。。是的,就是我的資料結構周開始的時候我發現。。。我特麼才會單點更新是怎麼回事!只會區間查詢是腫麼回事!!摔!

恩。。。就是表達一下弱渣的心情。。。。

區間更新,用到延遲操作。

延遲操作應該是這麼回事。線段樹的優越性就是體現在,第一是二分查詢,第二是區間操作。當我們需要多次對區間進行操作的時候,如果每次都更新每個區間內的每個節點,那麼線段樹的優勢就不復存在啦!所以,對區間進行延遲操作,就是操作該區間的時候,標記該區間,表示操作過,但是對其子區間不進行更新。然後如果下一次我還要操作這個區間,或者是它的子區間,那麼我就在對它的子區間進行上一次未完成的更新。並且下次操作是上次操作的子區間,所以一定會「經過」上次操作的區間,如果發現被標記了,表示接下來的區間未更新,就順便在查詢下次操作的區間的時候把上次操作的更新完成,並且將這種狀態(操作or未操作)傳遞給子區間的子區間。

強烈建議畫乙個[1,10]的線段樹,自己劃兩下比想乙個小時管用多了。

#include #define maxn 100010

int tree[maxn<<2],col[maxn<<2];

void create(int l,int r,int rt)

int mid=(l+r)>>1;

create(l,mid,rt<<1);create(mid+1,r,rt<<1|1);

tree[rt]=tree[rt<<1]+tree[rt<<1|1];

}void pushdown(int rt,int d)

}void update(int ll,int rr,int l,int r,int rt,int c)

pushdown(rt,r-l+1);

int mid=(l+r)>>1;

if(rr<=mid) update(ll,rr,l,mid,rt<<1,c);

else if(ll>mid) update(ll,rr,mid+1,r,rt<<1|1,c);

else

tree[rt]=tree[rt<<1]+tree[rt<<1|1];

}int main()

printf("case %d: the total value of the hook is %d.\n",++cas,tree[1]);

}return 0;

}

hdu1698線段樹(區間更新)

題目鏈結just a hook 乙個鎖鏈,其組成成部分有三種材料,金銀銅,分數為3 2 1,每次可以更換一段的材料,求最後的分數 鉤子最多長100,000 操作最多有100,000次,肯定不能暴力 線段樹 延遲標記lazy 每個節點新增加乙個標記 lazy 每次要更新節點時,不更新到葉節點,記錄這個...

HDU 1698 線段樹(區間更新

題目鏈結 思路 今天才入門線段樹,一開始做這題還有一點懵,因為我開始的思路是區間更新時要考慮之前的狀態,比如之前的乙個需要更新的節點是鐵 1 現在再要求更新為鐵 1 則不進行更新.然後就要分很多情況去討論,很麻煩.所以另外想了乙個思路 受懶操作的啟發,我想我能不能定義乙個向下傳遞的值type 傳遞後...

hdu1698 線段樹更新區間

線段樹 更新整個區間 不要一直更新到節點,用乙個標記值 1標記是否雜色。更新的時候如果該段正好是要更新的段則將其更新即可。否則說明要更新的段與當前的tt step 這一段不一致,則要將tt step 這一段拆分成2段,遞迴呼叫更新step 2及step 2 1,更新後tt step 將變成雜色。所以...