zoukankan      html  css  js  c++  java
  • 【HDU1166】敌兵布阵-单点修改和区间求和

    题目大意:一个长为N的数列A,对它进行操作:1.Add/Sub i j:将Ai增加/减去j。2.Query i j:询问Ai+...+Aj的值。对于每个询问,给出正确的答案。

    做法:一道入门题,用线段树和树状数组都能做,比较简单。

    因为树状数组编程复杂度比较低,所以这里只贴树状数组的代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int T,n,c[50010]={0};
    char op[10]={0};
    
    int lowbit(int i)
    {
      return i&(-i);
    }
    
    void add(int x,int a)
    {
      for(int i=x;i<=n;i+=lowbit(i))
        c[i]+=a;
    }
    
    int sum(int x)
    {
      int s=0;
      for(int i=x;i>0;i-=lowbit(i))
        s+=c[i];
      return s;
    }
    
    int query(int a,int b)
    {
      return sum(b)-sum(a-1);
    }
    
    int main()
    {
      scanf("%d",&T);
      for(int t=1;t<=T;t++)
      {
        scanf("%d
    ",&n);
    	memset(c,0,sizeof(c));
    	for(int i=1;i<=n;i++)
    	{
    	  int a;
    	  scanf("%d",&a);
    	  if (i==n) scanf("
    ");
    	  add(i,a);
    	}
    	printf("Case %d:
    ",t);
    	scanf("%s",op);
    	while(op[0]!='E')
    	{
    	  int a,b;
    	  scanf("%d %d
    ",&a,&b);
    	  if (op[0]=='A') add(a,b);
    	  if (op[0]=='S') add(a,-b);
    	  if (op[0]=='Q') printf("%d
    ",query(a,b));
    	  scanf("%s",op);
    	}
      }
      
      return 0;
    }
    



  • 相关阅读:
    位置控制
    Scaleform结合C++编程
    使用定点缓存进行绘制
    纹理
    动态规划:背包问题
    希尔排序
    折半插入排序
    快速排序
    上楼梯算法
    归并排序
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793997.html
Copyright © 2011-2022 走看看