hdu1166 敌兵布阵

 

  很基础的线段树,本人做的第一个线段树题目,建树、插入、删除等功能会实现就可以了,另外不知道为什么用映射数组模拟一直WA。。。。ORZ

   代码如下:

   #include<iostream>
using namespace std;
const int maxsize = 50000;
struct Stree
{
       int left, right;      
       int cover;
};
Stree tree[3*maxsize];
int sum;
void Creat(int l, int r, int i)
{
     tree[i].left = l;
     tree[i].right = r;
     tree[i].cover = 0;
     if (l == r)return ;
     int mid = (l + r)/2;
     Creat(l, mid, 2*i);
     Creat(mid+1, r, 2*i+1);    
}
void Insert(int num, int i, int j)
{
     int a = tree[num].left, b = tree[num].right;
     if (i >= a && i <= b){
        tree[num].cover += j;     
     }    
     if (a == b)return ;
     if (i < a || i > b)return ;
     int mid = (a + b)/2;
     if (i <= mid)Insert(2*num, i, j);
     if (i > mid)Insert(2*num+1, i, j);
}
void counter(int num, int l, int r)
{
    
     int a = tree[num].left, b = tree[num].right;
     int mid = (a + b)/2;
     if (l == a && r == b){
        sum += tree[num].cover;       
        return  ;
     }   
     else
          if (l > mid)counter(2*num+1, l, r);
          else
              if (r <= mid)counter(2*num, l, r);
              else {
                   counter(2*num, l, mid);
                   counter(2*num+1, mid+1, r);
              }             
}
int main()
{
    int t;
    scanf("%d", &t);
    int ss = 0;
    while (t--){
          int n;
          scanf("%d", &n);
          Creat(1, n, 1);
          for (int i = 1; i <= n; i ++){
              int k;
              scanf("%d", &k);
              Insert(1, i, k);   
          } 
          printf("Case %d:/n",++ss);   
          string s;
          while (cin >> s && s!="End"){
                int loc, num;
                if (s == "Add"){
                   scanf("%d%d", &loc, &num);
                   Insert(1, loc, num);     
                }
                if (s == "Sub"){
                   scanf("%d%d", &loc, &num);
                   Insert(1, loc, -num);       
                }
                if (s == "Query"){
                   scanf("%d%d", &loc, &num);
                   sum = 0;
                   counter(1, loc, num);
                   printf("%d/n",sum);
                }
          }
    }
    return 0;   
}

 

 

你可能感兴趣的:(hdu1166 敌兵布阵)