hdu1698(線段樹懶惰法)

2021-09-09 04:05:04 字數 901 閱讀 3805

大意:給一組棍子染色,不同的顏色有不同的值,執行一系列的區間染色後,問這組棍子的總值是多少。

題目分析:建樹:節點的域有左右節點和顏色,l,r,num;num=0時表示這個區間由多種顏色覆蓋。

更新的時候,如果更新區間比當前區間小,並且當前區間的顏色大於0,說明已經被完全染色,就把該區間顏色傳遞到左右子樹上,該區間染色為0,然後根據更新區間的大小,在左右子樹上去搜尋。

求和的時候遇到區間的num>0的時候說明完全被染色過了,就把區間的長度乘以顏色的值加到總和裡面去,然後結束這個方向的遞迴查詢,

**:

#includeusing namespace std;

struct node

tree[400000];

int ans;

void build(int i,int l,int r)

}void updata(int i,int l,int r,int v)

if(tree[i].num==v)

return ;

if(tree[i].num>0)

int mid=(tree[i].l+tree[i].r)/2;

if(r<=mid)

else

if(l>mid)

updata(i*2+1,l,r,v);

else }

void getsum(int i,int l,int r)

else }

}int main()

ans=0;

getsum(1,1,n);

printf("case %d: the total value of the hook is %d.\n",++k,ans);

} return 0;

}

hdu 1698 線段樹區間更新 懶惰標記

題意 給n個鉤子,每次都會更新從x到y這個範圍的鉤子價值,最後求鉤子的總價值。初始的鉤子價值為1.直接暴力求解是會超時,需要有線段樹懶惰標記維護資料。線段樹的懶惰標記,直接記錄了在x到y之間的資料,這樣可以減少遞迴總數。1 include2 include3 using namespace std ...

hdu1698之線段樹

詳解請看 注釋 include include include include include include include include include define inf 99999999 using namespace std const int max 100000 10 sum表示區...

HDU 1698 線段樹區間修改

一道線段樹區間替換的模板題 練習一下notonlysuccess的線段樹模板 注意注意!這兩個運算符號的優先順序非常低,只要寫到就要加括號,調了兩個小時的血淚啊 include include define lson l,m,rt 1 define rson m 1,r,rt 1 1 define ...