当前位置:编程学习 > C/C++ >>

hdu - 1166 - 敌兵布阵

题意:第一行一个整数T,表示有T组数据。每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 接下来每行有一条命令,命令有4种形式:
         (1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
         (2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
         (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
         (4)End 表示结束,这条命令在每组数据最后出现;
         每组数据最多有40000条命令
 
——>>直接BIT,就像模版题。
[cpp] 
#include <iostream>  
#include <cstdio>  
#include <cstring>  
  
using namespace std;  
  
const int maxn = 50000 + 10;  
int a[maxn], lowerbit[maxn], C[maxn], N;  
  
int sum(int x)      //BIT前x项和  
{  
    int ret = 0;  
    while(x > 0)  
    {  
        ret += C[x];  
        x -= lowerbit[x];  
    }  
    return ret;  
}  
void add(int x, int d)      //BIT修改——加  
{  
    while(x <= N)  
    {  
        C[x] += d;  
        x += lowerbit[x];  
    }  
}  
void sub(int x, int d)      //BIT修改——减  
{  
    while(x <= N)  
    {  
        C[x] -= d;  
        x += lowerbit[x];  
    }  
}  
int main()  
{  
    int T, cnt = 1, i, j;  
    for(i = 0; i < maxn; i++) lowerbit[i] = i&(-i);  
    scanf("%d", &T);  
    while(T--)  
    {  
        memset(C, 0, sizeof(C));  
        scanf("\n%d\n", &N);  
        for(i = 1; i <= N; i++)  
        {  
            scanf("%d", &a[i]);  
            add(i, a[i]);  
        }  
        char s[7];  
        printf("Case %d:\n", cnt++);  
        while(~scanf("%s", s))  
        {  
            if(strcmp(s, "End") == 0) break;  
            scanf("%d%d", &i, &j);  
            if(strcmp(s, "Query") == 0) printf("%d\n", sum(j) - sum(i-1));  
            else if(strcmp(s, "Add") == 0) add(i, j);  
            else sub(i, j);  
        }  
    }  
    return 0;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,