題目概述:
一段區間從1~n,每次操作將某一段全部改為x,操作完成後求整個區間和。
大致思路:
典型的乙個rmq模板題。只需要注意add操作裡pushdown的+=改成=就可以了。
還有注意在build_tree的時候初始化整棵樹!!!
還有注意在build_tree的時候初始化整棵樹!!!
還有注意在build_tree的時候初始化整棵樹!!!
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11using
namespace
std;
1213
#define sacnf scanf
14#define scnaf scanf
15#define maxn 100010
16#define maxm 26
17#define inf 1061109567
18#define eps 0.001
19const
double pi=acos(-1.0
);20
#define mod 1000000007
21#define maxnum 10000
22void swap(int &a,int &b)
23int abs(int x)
24 typedef long
long
ll;25 typedef unsigned int
uint;26
27struct
node
28 tree[4*maxn];
3132
void build_tree(int l,int r,int
dir)
3340
int m=(l+r)>>1
;41 build_tree(l,m,dir*2
);42 build_tree(m+1,r,dir*2+1
);43 tree[dir].val=tree[dir*2].val+tree[dir*2+1
].val;44}
4546
void push(int l,int r,int
dir)
4755}56
57void modify(int l,int r,int dir,int ql,int qr,int
c)58
66push(l,r,dir);
67int m=(l+r)>>1
;68 modify(l,m,dir*2
,ql,qr,c);
69 modify(m+1,r,dir*2+1
,ql,qr,c);
70 tree[dir].val=tree[dir*2].val+tree[dir*2+1
].val;71}
7273
intmain()
7490 printf("
case %d: the total value of the hook is %d.\n
",kase,tree[1
].val);91}
92//
clock_t ed=clock();
93//
printf("\n\ntime used : %.5lf ms.\n",(double)(ed-st)/clocks_per_sec);
94return0;
95 }
線段樹成段更新 hdoj 1698
題意 對乙個線段上的值進行修改,一次可以把 i,j 這個區間上的值改為1,2,或3。1 n這個區間上數字的和 思路 一道很加深對成段更新理解的題目,需要成段更新加上一點技巧具體見 update include include includeusing namespace std const int ...
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 中的,可是如何理解這...
HDOJ5692解題報告 dfs序 線段樹
題目概述 中文題面就不贅述了。大致思路 這個題給出的是一棵樹,我們可以使用dfs序將這棵樹處理成一條鏈,然後對這條鏈來進行資訊維護和查詢。有兩種操作,0 x是詢問從0出發 題目保證0為樹根 經過x的路徑中的最大權值,1 x y是將點x的權值修改成y,這時我們用線段樹來維護乙個d i 表示點i到0點的...