最基本的敌兵布阵C++实现杭电1166

论坛 期权论坛 脚本     
匿名技术用户   2020-12-28 18:34   496   0

#include<iostream>
#include<string>
using namespace std;

#define MAXN 50000
int tree[MAXN*2+1];

void build(int node, int l, int r, int *s)
{
 if(l == r)
 {
  tree[node] = s[l];
  return;
 }
 else
 {
  int m = (l+r)>>1;
  build(node<<1, l, m, s);
  build(node<<1|1, m+1, r, s);
  tree[node] = tree[node<<1] + tree[node<<1|1];   
 }
}

void update(int node, int l, int r, int idx, int rt)
{
 if( l == r)
 {
 tree[node] += rt;
 return;
 }
  int m = (l+r)>>1;
  if(idx <= m)
   update(node<<1,l,m,idx,rt);
  else
  {
   update(node<<1|1,m+1,r,idx,rt);
  }
  tree[node] = tree[node<<1]+tree[node<<1|1];
}

int Query(int node, int begin, int end, int l, int r)
{
 if(l<=begin && r>=end)
 {
  return tree[node];
 }
 
  int p1=0,p2=0;
  int m = (begin+end)>>1;
  
  if(l<=m)
   p1 = Query(node<<1,begin,m,l,r);
  if(r>=m+1)
   p2 = Query(node<<1|1,m+1,end,l,r);
  return p1+p2;
 
}





int main()
{
 int T,N,i,j,TEMP;
 int s[MAXN];
 string order;
 cin >> T;
 TEMP = T;
 while(T--)
 {
  cout << "Case " << TEMP - T<<":"<<endl;
  cin >> N;
  for(int i=1;i<N+1;i++)
  {
   cin >> s[i];
  }
   
  build(1,1,N,s);
  
  while(cin >> order)
  {
   if(order == "Add")
   {
    cin >> i;
    cin >> j;
    update(1,1,N,i,j);
   }else if(order == "Sub")
   {
    cin >> i;
    cin >> j;
    update(1,1,N,i,-j);
   }else if(order == "Query")
   {
    cin >> i;
    cin >> j;
    cout << Query(1,1,N,i,j) << endl;
   }else if (order == "End")
   {
    break;
   }
  }
 }
}



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP