標籤:acm c語言 演算法 編程 線段樹
題目地址:HDU 1698
區間替換裸題。同樣利用lazy延遲標記數組,這裡只是當lazy下放的時候把下面的lazy也全部改成lazy就好了。
代碼如下:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;#define lson l, mid, rt<<1#define rson mid+1, r, rt<<1|1const int MAXN=1e5+10;int sum[MAXN<<3], lazy[MAXN<<3];void PushUp(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void PushDown(int rt, int m){ if(lazy[rt]) { lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt]; sum[rt<<1]=lazy[rt]*(m-(m>>1)); sum[rt<<1|1]=lazy[rt]*(m>>1); lazy[rt]=0; }}void build(int l, int r, int rt){ lazy[rt]=0; if(l==r) { sum[rt]=1; return ; } int mid=l+r>>1; build(lson); build(rson); PushUp(rt);}void update(int ll, int rr, int x, int l, int r, int rt){ if(ll<=l&&rr>=r) { lazy[rt]=x; sum[rt]=(r-l+1)*x; return ; } PushDown(rt, r-l+1); int mid=l+r>>1; if(ll<=mid) update(ll,rr,x,lson); if(rr>mid) update(ll,rr,x,rson); PushUp(rt);}int main(){ int n, i, a, b, c, t, q, num=0; scanf("%d",&t); while(t--) { num++; scanf("%d",&n); build(1,n,1); scanf("%d",&q); while(q--) { scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } printf("Case %d: The total value of the hook is %d.\n",num,sum[1]); } return 0;}