HDU 1698(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698
属于区间染色与区间求和问题,用线段树解决~~~
代码如下:
1 #include <stdio.h> 2 #define N 300002 3 #define LL(x) ((x)<<1) 4 #define RR(x) ((x)<<1|1) 5 6 typedef struct 7 { 8 int lson, rson; 9 int val; 10 } seg_tree; 11 12 seg_tree s[N]; 13 14 void build(int left, int right, int idx) 15 { 16 s[idx].lson = left; 17 s[idx].rson = right; 18 s[idx].val = 1; 19 if(left == right) 20 { 21 return; 22 } 23 int mid = (left + right) / 2; 24 build(left, mid, LL(idx)); 25 build(mid + 1, right, RR(idx)); 26 } 27 28 void update(int left, int right, int idx, int val) 29 { 30 if(left <= s[idx].lson && s[idx].rson <= right) 31 { 32 s[idx].val = val; 33 return; 34 } 35 if(s[idx].val != -1) 36 { 37 s[LL(idx)].val = s[RR(idx)].val = s[idx].val; 38 s[idx].val = -1; 39 } 40 int mid = (s[idx].lson + s[idx].rson) / 2; 41 if(left <= mid) 42 update(left, right, LL(idx), val); 43 if(right > mid) 44 update(left, right, RR(idx), val); 45 } 46 47 int query(int left, int right, int idx) 48 { 49 if(left == s[idx].lson && right == s[idx].rson) 50 { 51 if(s[idx].val != -1) 52 { 53 return (right - left + 1) * s[idx].val; 54 } 55 else 56 { 57 int mid = (s[idx].lson + s[idx].rson) / 2; 58 return query(left, mid, LL(idx)) + query(mid + 1, right, RR(idx)); 59 } 60 } 61 int mid = (s[idx].lson + s[idx].rson) / 2; 62 if(right <= mid) 63 { 64 return query(left, right, LL(idx)); 65 } 66 else if(left > mid) 67 { 68 return query(left, right, RR(idx)); 69 } 70 else 71 { 72 return query(left, mid, LL(idx)) + query(mid + 1, right, RR(idx)); 73 } 74 } 75 76 int main() 77 { 78 int t; 79 int n; 80 int ncase; 81 int i, j; 82 int a, b, val; 83 scanf("%d", &t); 84 for(i = 1; i <= t; i++) 85 { 86 scanf("%d", &n); 87 scanf("%d", &ncase); 88 build(1, n, 1); 89 for(j = 0; j < ncase; j++) 90 { 91 scanf("%d%d%d", &a, &b, &val); 92 update(a, b, 1, val); 93 } 94 printf("Case %d: The total value of the hook is %d.\n", i, query(1, n, 1)); 95 } 96 return 0; 97 }
第二种代码:
1 #include <stdio.h> 2 #define N 300000 3 #define LL(x) ((x)<<1) 4 #define RR(x) ((x)<<1|1) 5 6 typedef struct 7 { 8 int lson, rson; 9 int val; 10 } seg_tree; 11 seg_tree s[N]; 12 13 int ans; 14 15 void build(int left, int right, int idx) 16 { 17 s[idx].lson = left; 18 s[idx].rson = right; 19 s[idx].val = 1; 20 if(left == right) 21 return; 22 else 23 { 24 int mid = (left + right) / 2; 25 build(left, mid, LL(idx)); 26 build(mid + 1, right, RR(idx)); 27 } 28 } 29 30 void update(int left, int right, int idx, int val) 31 { 32 if(left == s[idx].lson && s[idx].rson == right) 33 { 34 s[idx].val = val; 35 return; 36 } 37 if(s[idx].val == val) 38 return; 39 if(s[idx].val > 0) 40 { 41 s[LL(idx)].val = s[RR(idx)].val = s[idx].val; 42 s[idx].val = 0; 43 } 44 int mid = (s[idx].lson + s[idx].rson) / 2; 45 if(right <= mid) 46 { 47 update(left, right, LL(idx), val); 48 } 49 else if(left > mid) 50 { 51 update(left, right, RR(idx), val); 52 } 53 else 54 { 55 update(left, mid, LL(idx), val); 56 update(mid + 1, right, RR(idx), val); 57 } 58 } 59 60 int get_sum(int left, int right, int idx) 61 { 62 if(s[idx].val > 0) 63 { 64 return (s[idx].rson - s[idx].lson + 1) * s[idx].val; 65 } 66 else 67 { 68 int mid = (s[idx].lson + s[idx].rson) / 2; 69 if(right <= mid) 70 { 71 return get_sum(left, right, LL(idx)); 72 } 73 else if(left > mid) 74 { 75 return get_sum(left, right, RR(idx)); 76 } 77 else 78 { 79 return get_sum(left, mid, LL(idx)) + get_sum(mid + 1, right, RR(idx)); 80 } 81 } 82 } 83 84 int main() 85 { 86 int t; 87 int n, ncase; 88 int i, j; 89 scanf("%d", &t); 90 for(i = 1; i <= t; i++) 91 { 92 scanf("%d", &n); 93 scanf("%d", &ncase); 94 build(1, n, 1); 95 int a, b, val; 96 for(j = 0; j < ncase; j++) 97 { 98 scanf("%d%d%d", &a, &b, &val); 99 update(a, b, 1, val); 100 } 101 printf("Case %d: The total value of the hook is %d.\n", i, get_sum(1, n, 1)); 102 } 103 return 0; 104 }
刚开始时,用暴力解,但超时,也贴出代码:
1 #include <stdio.h> 2 #define N 100001 3 4 int s[N]; 5 6 void solve(int a, int b, int c) 7 { 8 int i; 9 for(i = a; i <= b; i++) 10 { 11 s[i] = c; 12 } 13 } 14 15 int main() 16 { 17 int i, j; 18 int t; 19 int n; 20 int ncase; 21 int a, b, c, sum; 22 scanf("%d", &t); 23 for(i = 1; i <= t; i++) 24 { 25 sum = 0; 26 scanf("%d", &n); 27 for(j = 1; j <= n; j++) 28 { 29 s[j] = 1; 30 } 31 scanf("%d", &ncase); 32 for(j = 0; j < ncase; j++) 33 { 34 scanf("%d%d%d", &a, &b, &c); 35 solve(a, b, c); 36 } 37 for(j = 1; j <= n; j++) 38 { 39 sum += s[j]; 40 } 41 printf("Case %d: The total value of the hook is %d.\n", i, sum); 42 } 43 }