線段樹成段更新 hdoj 1698

2021-09-02 08:54:48 字數 991 閱讀 2369

題意:

對乙個線段上的值進行修改,一次可以把[i,j]這個區間上的值改為1,2,或3。1---n這個區間上數字的和

思路:一道很加深對成段更新理解的題目,需要成段更新加上一點技巧具體見**update()

#include#include#includeusing namespace std;

const int nmax = 100010;

structnode[3 * nmax];

int ans;

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

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

build(l ,m ,u * 2);

build(m+1 , r , u*2+1);

}//lazy值為0的時候代表這個區間上數字不唯一,初始值為1

void update(int left ,int right , int val ,int u)

if(node[u].lazy != 0)

int m = (node[u].r + node[u].l)>>1;

if(left <= m)

if(right >= m+1)

}void query(int left ,int right ,int u)

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

if(right <= m)

if(left >= m+1)

query(left , m , u*2);

query(m+1 , right , u*2 + 1);

}int main()

ans=0;

query(1 , n ,1);

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

// printf("%d\n",ans);

}return 0;

}

HDOJ1698解題報告 線段樹模板

題目概述 一段區間從1 n,每次操作將某一段全部改為x,操作完成後求整個區間和。大致思路 典型的乙個rmq模板題。只需要注意add操作裡pushdown的 改成 就可以了。還有注意在build tree的時候初始化整棵樹!還有注意在build tree的時候初始化整棵樹!還有注意在build tre...

hdu1698 線段樹成段更新

成段更新 通常這對初學者來說是一道坎 需要用到延遲標記 或者說懶惰標記 簡單來說 就是每次更新的時候不要更新到底 用延遲標記使得更新延遲到下次需要更新 or 詢問到的 時候 include include define lson l,m,rt 1 define rson m 1,r,rt 1 1 u...

HDOJ 1698 區間更新

include include include include include using namespace std define lson l m rt 1 define rson m 1,r rt 1 1 寫下自己對區間操作的一些理解,首先全部的資料都是儲存在sum rt 中的,可是如何理解這...