• HDU 1166 敌兵布阵 (树状数组和线段树解法)


    题目: 戳我

    树状数组code:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <stack>
    #include <map>
    
    using namespace std;
    #define clc(a, b) memset(a, b, sizeof(a))
    const int inf = 0x3f;
    const int INF = 0x3f3f3f3f;
    const int maxn = 5e4+5;
    
    int c[maxn], n;
    
    int lowbit(int x)
    {
        return x&-x;
    }
    
    void add(int x, int val)
    {
        while(x<=n)
        {
            c[x] += val;
            x += lowbit(x);
        }
    }
    
    int query(int l, int r)
    {
        int sum1 = 0, sum2 = 0;
        while(r > 0)
        {
            sum1 += c[r];
            r -= lowbit(r);
        }
        l = l-1;
        while(l > 0)
        {
            sum2 += c[l];
            l -= lowbit(l);
        }
        return sum1-sum2;
    }
    
    int main()
    {
        int T, x, l, r;
        char q[100];
        scanf("%d", &T);
        for(int t = 1; t <= T; t++)
        {
            scanf("%d", &n);
            clc(c, 0);
            for(int i = 0; i < n; i++)
            {
                scanf("%d", &x);
                add(i+1, x);
            }
            printf("Case %d:
    ", t);
            while(true)
            {
                scanf(" %s", q);
                if(!strcmp(q, "End")) break;
                if(!strcmp(q, "Query"))
                {
                    scanf("%d %d", &l, &r);
                    printf("%d
    ", query(l, r));
                }
                else if(!strcmp(q, "Sub"))
                {
                    scanf("%d %d", &l, &x);
                    add(l, -x);
                }
                else
                {
                    scanf("%d %d", &l, &x);
                    add(l, x);
                }
            }
        }
        return 0;
    }
    

    线段树code:

    线段树代码太长===

    #include <stdio.h>
    #include <string.h>
    int a[50010];
    struct node
    {
        int left,right,sum;
    }b[150010];
     
     
    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 ;
        }
     
        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;
     
    }
     
    void  Add(int id,int num,int i)
    {
        if(b[i].left==b[i].right)
        {
            b[i].sum=b[i].sum+num;
            return ;
        }
        else
        {
            b[i].sum=b[i].sum+num;
            if(id<=b[i*2].right) Add(id,num,2*i);
            else Add(id,num,2*i+1);
        }
    }
     
     
    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);
    }
     
     
    int main()
    {
        int Case;
        int n;
        char str[10];
        scanf("%d",&Case);
        int id,num;
        int i;
        int k=1;
        while(Case--)
        {
     
            scanf("%d",&n);
            for(i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
            }
            build(1,n,1);
            printf("Case %d:
    ",k++);
            while(1)
            {
     
                scanf("%s",str);
                if(strcmp(str,"End")==0) break;
                scanf("%d%d",&id,&num);
                if(strcmp(str,"Query")==0)
                {
                    printf("%d
    ",Query(id,num,1));
                }
                if(strcmp(str,"Add")==0)
                {
                    //scanf("%d%d",&id,&num);
                    Add(id,num,1);
                }
                if(strcmp(str,"Sub")==0)
                {
                    //scanf("%d%d",&id,&num);
                    Add(id,-num,1);
                }
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    大并发服务器开发(实战)
    [亲测有效]Ubuntu20.04安装ROS1和ROS2
    Linux多进程开发(二)
    Linux网络编程(四 )
    统计当前系统的TCP连接状态的种类以及对应的个数
    Linux系统编程入门(一)
    gdb与core 最有效的调试手段之一
    Port was alread in use
    Nginx实现统一端口反向代理多个服务
    Windows Terminal打开管理员权限的PowerShell
  • 原文地址:https://www.cnblogs.com/tenlee/p/4551194.html
Copyright © 2020-2023  润新知