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 }
View Code

 

posted on 2016-03-18 23:31  polarday  阅读(101)  评论(0)    收藏  举报

导航