敌兵布阵

单点更新和区间更新还是有一些区别的,应该注意!

【题目链接】敌兵布阵

【题目类型】线段树单点更新

&题意:

第一行一个整数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条命令

&题解:

线段树 单点更新模板题

【时间复杂度】\(O(nlogn)\)

&代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; #define lsn b,m,rt<<1
#define rsn m+1,e,rt<<1|1 const int maxn=50000+9;
int seg[maxn<<2];
int a[maxn]; inline void PushUp(int rt)
{
//注意这: 一定是= 不是+= 因为在updata时 +=会错
seg[rt]=seg[rt<<1]+seg[rt<<1|1];
// seg[rt]+=seg[rt<<1]+seg[rt<<1|1]; 错的
}
void Build(int b,int e,int rt)
{
seg[rt]=0;
if (b==e){
seg[rt]=a[b];
return;
}
int m=b+e>>1;
Build(lsn);
Build(rsn);
PushUp(rt);
}
void Updata(int idx,int xx,int b,int e,int rt)
{
if (b==e){
seg[rt]+=xx;
return ;
}
int m=b+e>>1;
//这不用再像区间一样弄了 因为只有1个位置 所以if else就够了 不用if + if 了
if (idx<=m)
Updata(idx,xx,lsn);
else
Updata(idx,xx,rsn);
PushUp(rt);
}
int Query(int l,int r,int b,int e,int rt)
{
if (l<=b&&e<=r){
return seg[rt];
}
int m=b+e>>1;
int ans=0;
if (l<=m)
ans+=Query(l,r,lsn);
if (m<r)
ans+=Query(l,r,rsn);
return ans;
}
int K;
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
Build(1,n,1);
printf("Case %d:\n",++K);
char op[33];
int u,v;
while(1){
scanf("%s",op);
if (op[0]=='E') break;
scanf("%d%d",&u,&v);
if (op[0]=='A')
Updata(u,v,1,n,1);
if (op[0]=='S')
Updata(u,-v,1,n,1);
if (op[0]=='Q')
printf("%d\n",Query(u,v,1,n,1));
}
}
return 0;
}

最新文章

  1. 自动ftp上传文件脚本
  2. madplay播放控制
  3. wpf ListView DataTemplate方式的鼠标悬停和选中更改背景色
  4. LinqToEntity模糊查询的方法选择
  5. link标签和script标签跑到body下面,网页顶部有空白
  6. IntelliJ IDEA 常用设置讲解2
  7. 使用crontab不能正常执行的问题
  8. WCF Restful JQuery 跨域解决方法
  9. div 绝对布局居中
  10. NYOJ 16 矩形嵌套(动态规划)
  11. 点击推送消息跳转处理(iOS)
  12. mac 下nginx加入开机启动
  13. easyUI 添加排序到datagrid
  14. 个人觉得实用的Python姿势
  15. C - BLG POJ - 1417 种类并查集加dp(背包)
  16. Redis趣谈一则
  17. codevs 1080 线段树练习(线段树)
  18. 转——git常见使用命令及git原理
  19. &lt;6&gt;Cocos Creator​​​​​​​调试
  20. MYSQL常用函数(系统信息函数)

热门文章

  1. SQL 事务
  2. android view :事件
  3. web设计中那些因素可能影响网站后期优化
  4. 联合(union)类型有哪些使用场景
  5. JSTL的fn函数
  6. ionic 跨页面传值的几种方法
  7. 解析C语言结构体对齐(内存对齐问题)
  8. asdddddddddddddddd
  9. Linux下高cpu解决方案(转载)
  10. 模板方法模式(Template Method)