Hdu--1698(线段树,区间更新)
2014-09-26 22:43:12
思路:典型的线段树+区间更新,用到lazy思想。
1 /************************************************************************* 2 > File Name: 1698.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Fri 26 Sep 2014 10:24:21 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <queue> 14 #include <iostream> 15 #include <algorithm> 16 using namespace std; 17 #define lpos (pos << 1) 18 #define rpos (pos << 1|1) 19 #define getmid(l,r) (l + (r - l) / 2) 20 typedef long long ll; 21 const int INF = 1 << 29; 22 const int maxn = 100010; 23 24 struct node{ 25 int l,r; 26 int sum,flag; 27 }tree[maxn << 2]; 28 29 int tl,tr,tv; 30 31 void Build_tree(int pos,int l,int r){ 32 tree[pos].l = l; 33 tree[pos].r = r; 34 tree[pos].sum = r - l + 1; 35 tree[pos].flag = 0; 36 if(l == r) 37 return; 38 int mid = getmid(l,r); 39 Build_tree(lpos,l,mid); 40 Build_tree(rpos,mid + 1,r); 41 } 42 43 void Push_down(int pos){ 44 int v = tree[pos].flag; 45 if(v){ 46 tree[lpos].flag = tree[rpos].flag = v; 47 tree[lpos].sum = v * (tree[lpos].r - tree[lpos].l + 1); 48 tree[rpos].sum = v * (tree[rpos].r - tree[rpos].l + 1); 49 tree[pos].flag = 0; 50 } 51 } 52 53 void Update(int pos,int l,int r){ 54 if(tl <= l && r <= tr){ 55 tree[pos].flag = tv; 56 tree[pos].sum = tv * (tree[pos].r - tree[pos].l + 1); 57 return; 58 } 59 Push_down(pos); 60 int mid = getmid(l,r); 61 if(tl <= mid) Update(lpos,l,mid); 62 if(tr > mid) Update(rpos,mid + 1,r); 63 tree[pos].sum = tree[lpos].sum + tree[rpos].sum; 64 } 65 66 int main(){ 67 int Case,N,Q; 68 scanf("%d",&Case); 69 for(int t = 1; t <= Case; ++t){ 70 scanf("%d%d",&N,&Q); 71 Build_tree(1,1,N); 72 while(Q--){ 73 scanf("%d%d%d",&tl,&tr,&tv); 74 Update(1,1,N); 75 } 76 printf("Case %d: The total value of the hook is %d.\n",t,tree[1].sum); 77 } 78 return 0; 79 }

浙公网安备 33010602011771号