zoukankan      html  css  js  c++  java
  • HDU 1166

    敌兵布阵,线段树,N个阵营,每个阵营会增加或者减少m个士兵,查询的时候要查询任意区间里的士兵数量

    AC代码:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    int a[50001];
    
    struct node
    {
        int left,right,sum;
    } b[150005];
    
    int Query(int left,int right,int i)
    {
        int mid;
        if(b[i].left==left&&b[i].right==right)
        {
            return b[i].sum;
        }
        mid=(b[i].left+b[i].right)/2;
        if(right<=mid)
        {
            return Query(left,right,2*i);
        }
        else if(left>mid)
        {
            return Query(left,right,2*i+1);
        }
        else
        {
            return Query(left,mid,2*i)+Query(mid+1,right,2*i+1);
        }
    }
    void Add(int j,int num,int i)
    {
        if(b[i].left==b[i].right)
        {
            b[i].sum+=num;
            return ;
        }
        else
        {
            b[i].sum+=num;
            if(j<=b[2*i].right)
            {
                Add(j,num,2*i);
            }
            else
            {
                Add(j,num,2*i+1);
            }
        }
    }
    void Build(int left,int right,int i){//建树
      int mid;
      b[i].left=left;
      b[i].right=right;
      if(left==right){//先用数组存下该队的人
        b[i].sum=a[left];
        return ;
      }
      //cout<<"ok"<<endl;
      mid=(left+right)/2;
      Build(left,mid,2*i);//递归建立左子树
      Build(mid+1,right,2*i+1);//递归建立右子树
      b[i].sum=b[2*i].sum+b[2*i+1].sum;//记录该结点左右子树的值
    }
    int main()
    {
        int T,n,k,j,num;
        char s[10];
        scanf("%d",&T);
        k=0;
        while(T--)
        {
            scanf("%d",&n);
            for(int i=1; i<=n; i++)
            {
                scanf("%d",&a[i]);
            }
            printf("Case %d:
    ",++k);
            Build(1,n,1);
            while(1)
            {
                scanf("%s",s);
                if(!strcmp(s,"End"))
                {
                    break;
                }
                scanf("%d%d",&j,&num);
                if(!strcmp(s,"Query"))
                {
                    printf("%d
    ",Query(j,num,1));
                }
                else if(!strcmp(s,"Add"))
                {
                    Add(j,num,1);
                }
                else if(!strcmp(s,"Sub"))
                {
                    Add(j,-num,1);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    react-redux
    Vue中常用的UI框架
    vue中router与route的区别
    H5新增input属性
    H5新增的input类型
    菜鸡对作用域链的理解
    自己对路由的一些理解
    浏览器缓存
    黄瓜的不定期更新面试题
    ajax封装
  • 原文地址:https://www.cnblogs.com/qioalu/p/5396823.html
Copyright © 2011-2022 走看看