敌兵布阵

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30838    Accepted Submission(s): 13230

Problem Description
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.
Input
第一行一个整数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条命令
Output
对第i组数据,首先输出“Case i:”和回车,
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
Sample Input
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Sample Output
Case 1: 6 33 59
线段树
#include<stdio.h>
struct node
{int l;int r;int sum;
}p[1000000];
int ans;
void build_t(int t,int l,int r)
{p[t].r=r;p[t].l=l;p[t].sum=0;if(r==l)return;int temp=2*t;int mid=(l+r)/2;build_t(temp,l,mid);build_t(temp+1,mid+1,r);
}
void add(int t,int l,int k)
{if(p[t].l==p[t].r){p[t].sum+=k;return;}int temp=2*t;int mid=(p[t].l+p[t].r)>>1;if(l<=mid)add(temp,l,k);elseadd(temp+1,l,k);p[t].sum=p[temp].sum+p[temp+1].sum;}
void query(int t,int l,int r)
{if(p[t].r==r&&p[t].l==l){ans+=p[t].sum;return;}int temp=t<<1;int mid=(p[t].r+p[t].l)>>1;if(r<=mid)query(temp,l,r);else if(l>mid)query(temp+1,l,r);else{query(temp,l,mid);query(temp+1,mid+1,r);}}
int main()
{int t,i,x,y,n,cnt=1;char c[10];scanf("%d",&t);while(t--){scanf("%d",&n);build_t(1,1,n);for(i=1;i<=n;i++){scanf("%d",&x);add(1,i,x);}scanf("%s",c);printf("Case %d:\n",cnt++);while(c[0]!='E'){scanf("%d %d",&x,&y);if(c[0]=='Q'){ans=0;query(1,x,y);printf("%d\n",ans);}else  if(c[0]=='A'){add(1,x,y);}else  if(c[0]=='S')add(1,x,-y);scanf("%s",c);}}return 0;
}

树状数组

#include<stdio.h>
#include<string.h>
int c[200000];
int n;
int lowbit(int x)
{return x&(-x);
}
void  add(int x,int k)
{while(x<=n){c[x]+=k;x=x+lowbit(x);}
}
int Sum(int y)
{int sum=0;while(y>0){sum+=c[y];y=y-lowbit(y);}return sum;
}
int main()
{int i,t,x,y,a,cnt=1;char cc[10];scanf("%d",&t);while(t--){memset(c,0,sizeof(c));scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a);add(i,a);}scanf("%s",cc);printf("Case %d:\n",cnt++);while(cc[0]!='E'){scanf("%d %d",&x,&y);if(cc[0]=='Q')printf("%d\n",Sum(y)-Sum(x-1));else if(cc[0]=='A')add(x,y);elseadd(x,-y);scanf("%s",cc);}}return 0;
}

转载于:https://www.cnblogs.com/llei1573/p/3257504.html

hdu 1166 敌兵布阵相关推荐

  1. hdu 1166 敌兵布阵(单点更新)

    hdu 1166 敌兵布阵(基本操作) 有三种操作:询问区间总和,增加某个兵营的兵的数目,减少某个兵营的兵的数目.实际上也只有两个. 在更新的时候,每到一个区间就把当前区间的sum增加对应的数目,到达 ...

  2. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  3. 树状数组板子题之一:hdu 1166 敌兵布阵

    树状数组板子题之一:hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手 ...

  4. hdu 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. HDU 1166 敌兵布阵

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

    敌兵布阵                                                                             Time Limit: 2000/10 ...

  7. hdu 1166 敌兵布阵 树状数组

    敌兵布阵                                                                           Time Limit: 2000/1000 ...

  8. 【树状数组】HDU 1166 敌兵布阵

    敌兵布阵 日常题目胡乱总结 是个裸的树状数组qwq 区间查询+单点修改 字符判断相等那个地方我开始用的单引号 '  ' 直接不通过编译QAQ 第一遍交没有在一组数据结束后清空c数组 WA的让我很懵逼 ...

  9. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

最新文章

  1. 关于oracle spfile配置文件问题
  2. msdn关于Visual C++ 编译器选项的说明
  3. STM32 基础系列教程 20 - RTC
  4. c语言fgetc()函数(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动)
  5. php 挂机,用php实现qq挂机
  6. PHP 使用程序进行数据库字典文件生成 导出数据库字典
  7. java手机音乐文件夹,从原始文件夹打开音乐文件,使用Android上的意图在设备的默认应用程序上播放...
  8. android 对话框的父view是谁,android – 在对话框中获取相对于其父级的视图位置
  9. mysql中不要 秒的函数_Mysql中日期和时间函数应用不用求人 | 很文博客
  10. 您可能不知道可以使用Chrome开发者控制台执行的操作
  11. 河南省某炮旅的RAID5恢复
  12. windows10下安装JDK及环境变量设置
  13. indesign文字怎么绕排图片形状_indesign透明度怎么调整?indesign怎么设置图片透明度?...
  14. 单通道图像保存_3D图像展示篇结构更清晰
  15. BZOJ1296[SCOI2009] 粉刷匠
  16. 图片怎么做雕刻路径_浮雕做图的简要步骤
  17. 安装vs 2015 社区版
  18. 微信手机号授权解密失败问题现象和解决方法: getPhoneNumber
  19. 计算机桌面图标怎样变大变小,win7电脑桌面图标变大怎么恢复?win7桌面图标怎么变小?...
  20. 那个直播软件有软件测试课程,资讯详情-直播软件有哪些测试方法-柠檬班-自动化测试-软件测试培训-自学官网...

热门文章

  1. 1.1 基本图像导入、处理和导出
  2. 金字塔式梯度方向直方图(PHOG)
  3. DFS求连通块数目(深搜)
  4. SpringSecurity csrf验证忽略某些请求
  5. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) E. DNA Evolution 树状数组
  6. linux基础-第十单元 系统的初始化和服务
  7. Hibernate HQL的update方法详解
  8. javascript 注意事项
  9. C#获取数据库表信息,列信息
  10. cPanel下安装GodaddySSL教程