前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDU 1166 敌兵布阵

HDU 1166 敌兵布阵

作者头像
用户2965768
发布2018-08-30 16:10:54
2440
发布2018-08-30 16:10:54
举报
文章被收录于专栏:wymwym

http://acm.hdu.edu.cn/showproblem.php?pid=1166

题解:

此题用树状数组来做,其操作为给某一个兵营增加或减少人数,以及询问i~j营地的人数,可以用树状数组维护前i个营地的人数总数,通过前j个营地的人数的总数减去前i-1个营地的人数总数就得到了i~j营地的总人数了。

#include <iostream> #include <bits/stdc++.h> using namespace std; const int maxn=50005; int s[maxn],n; int lowbit(int k) {     return k&(-k); } void add(int k,int v)//向第k个营地增加v个人  {     while(k<=n)         {             s[k]+=v;             k+=lowbit(k);          }  } int sum(int k) {     int re=0;     while(k>0)     {         re+=s[k];         k-=lowbit(k);     }     return re; } int main() {     int t,ca=1;     char op[10];     scanf("%d",&t);     while(t--)     {         scanf("%d",&n);         memset(s,0,sizeof(s));         for(int i=1;i<=n;i++)         {             int num; scanf("%d",&num);             add(i,num);         }         printf("Case %d:\n",ca++);         int i,j;         while(scanf("%s",op)&&op[0]!='E')         {             scanf("%d %d",&i,&j);             if(op[0]=='Q')             {                 printf("%d\n",sum(j)-sum(i-1));             }else if(op[0]=='S')                   {                      add(i,-j);                   }else if(op[0]=='A')                           {                                add(i,j);                           }         }     }     return 0; } 

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档