HDU1166-敌兵布阵(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166
1 #include<bits/stdc++.h> 2 using namespace std; 3 class Node 4 { 5 private: 6 int val; 7 Node *left, *right; 8 9 public: 10 Node(); 11 void set_val(int v); 12 void set_left(Node* t); 13 void set_right(Node* t); 14 int get_val(); 15 Node* get_left(); 16 Node* get_right(); 17 }; 18 19 Node::Node() 20 { 21 left = NULL; 22 right = NULL; 23 val = 0; 24 } 25 26 void Node::set_val(int v) 27 { 28 val = v; 29 } 30 31 void Node::set_left(Node *t) 32 { 33 left = t; 34 } 35 36 void Node::set_right(Node *t) 37 { 38 right = t; 39 } 40 41 int Node::get_val() 42 { 43 return val; 44 } 45 46 Node* Node::get_left() 47 { 48 return left; 49 } 50 51 Node* Node::get_right() 52 { 53 return right; 54 } 55 56 void build(int l, int r, Node* cur, int *a) 57 { 58 if(l == r) 59 { 60 cur->set_val(a[l]); 61 return; 62 } 63 int mid = (l + r) >> 1; 64 65 cur->set_left(new Node); 66 build(l, mid, cur->get_left(), a); 67 68 cur->set_right(new Node); 69 build(mid+1, r, cur->get_right(), a); 70 71 cur->set_val(cur->get_left()->get_val() + cur->get_right()->get_val()); 72 } 73 74 void change(int i, int j, int curl, int curr, Node* cur) 75 { 76 if(curl == curr) 77 { 78 cur->set_val(cur->get_val() + j); 79 return; 80 } 81 82 int mid = (curl + curr)>>1; 83 if(i <= mid) 84 change(i, j, curl, mid, cur->get_left()); 85 else 86 change(i, j, mid+1, curr, cur->get_right()); 87 88 cur->set_val(cur->get_left()->get_val() + cur->get_right()->get_val()); 89 } 90 91 int Search(int l, int r, int curl, int curr, Node* cur) 92 { 93 if(l <= curl && r >= curr) 94 return cur->get_val(); 95 96 int mid = (curl + curr)>>1; 97 if(l > mid) 98 return Search(l, r, mid+1, curr, cur->get_right()); 99 100 if(r <= mid) 101 return Search(l, r, curl, mid, cur->get_left()); 102 103 return Search(l, r, curl, mid, cur->get_left()) + Search(l, r, mid+1, curr, cur->get_right()); 104 } 105 int main() 106 { 107 int T; 108 scanf("%d", &T); 109 char command[10],c[5][10]={"End","Query","Add","Sub"}; 110 for(int cas = 1; cas <= T; cas++) 111 { 112 int n; 113 scanf("%d", &n); 114 int *a = new int[n+1]; 115 for(int i = 1; i <= n; i++) 116 scanf("%d", &a[i]); 117 Node *root = new Node; 118 build(1, n, root, a); 119 printf("Case %d:\n", cas); 120 int i, j; 121 for(;;) 122 { 123 scanf("%s", command); 124 if(!strcmp(command,c[0])) 125 break; 126 127 else 128 { 129 scanf("%d %d",&i, &j); 130 if(!strcmp(command,c[1])) 131 printf("%d\n",Search(i, j ,1, n, root)); 132 else if(!strcmp(command,c[2])) 133 change(i, j, 1, n, root); 134 else if(!strcmp(command,c[3])) 135 change(i, -j, 1, n, root); 136 } 137 } 138 delete root; 139 delete a; 140 } 141 return 0; 142 }
浙公网安备 33010602011771号