A - 敌兵布阵
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

这是一年后用Java写的

import java.util.*;public class Main {static Scanner sc = new Scanner(System.in);final static int maxn = 50050;static class node{public int l,r;public int sum;node(int x,int y, int z){l = x; r = y; sum = z;}}static int digit[] = new int[maxn];static node tree[] = new node[maxn << 2]; static void BuildTree(int k, int l, int r){node gg = new node(l,r,0);tree[k] = gg;if(l == r){tree[k].sum = digit[l];return ;}int mid = (l + r) >> 1;BuildTree(k<<1, l, mid);BuildTree(k<<1|1, mid+1,r);tree[k].sum = tree[k<<1].sum + tree[k<<1|1].sum;return ;}static void update(int k, int pos,int val){if(tree[k].l == pos && tree[k].r == pos){tree[k].sum += val;return ;}int mid = (tree[k].l + tree[k].r) >> 1;if(pos <= mid)update(k<<1, pos,val);else update(k<<1|1, pos,val);tree[k].sum = tree[k<<1].sum + tree[k<<1|1].sum; return ;}static int Query(int k, int x, int y){if(x == tree[k].l && y == tree[k].r){return tree[k].sum;}int res = 0;int mid = (tree[k].l + tree[k].r) >> 1;if(y <= mid)res += Query(k<<1,x,y);else if(x > mid)res += Query(k<<1|1,x,y);else {res += Query(k<<1,x, mid);res += Query(k<<1|1,mid+1,y);}return res;}public static void main(String[] args) {int T;T = sc.nextInt();for(int cas = 1; cas <= T; cas++){int num = sc.nextInt();for(int i = 1; i <= num; i++)digit[i] = sc.nextInt();BuildTree(1, 1, num);String s;System.out.println("Case " + cas + ":");while(sc.hasNext()){s = sc.next();int x,y;if(s.equals("Query")){x = sc.nextInt();y = sc.nextInt();System.out.println(Query(1,x,y));}else if(s.equals("Add")){x = sc.nextInt();y = sc.nextInt();update(1,x,y);}else if(s.equals("Sub")){x = sc.nextInt();y = sc.nextInt();update(1,x,-y);}else if(s.equals("End"))break;}}}}

线段树:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 50005
using namespace std;int num[maxn];
struct Tree
{int l,r,sum;
}tree[maxn*4];//线段树比较耗空间一般开3~4倍;void build(int k,int l,int r)
{tree[k].l=l;tree[k].r=r;if(tree[k].l==tree[k].r){tree[k].sum=num[l];return ;}int mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}
void update(int k,int pos,int val)
{if(tree[k].l==tree[k].r){tree[k].sum=val;return;}int  mid=(tree[k].l+tree[k].r)>>1;if(pos<=mid)update(k<<1,pos,val);else update(k<<1|1,pos,val);tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}
int query(int k,int l,int r)
{if(l<=tree[k].l&&r>=tree[k].r){return tree[k].sum;}int mid=(tree[k].l+tree[k].r)>>1,ret=0;if(l<=mid)ret+=query(k<<1,l,r);if(r>mid)ret+=query(k<<1|1,l,r);return ret;
}int main()
{int cas,ca=1;char str[10];int a,b,n;scanf("%d",&cas);while(cas--){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&num[i]);printf("Case %d:\n",ca++);build(1,1,n);// 构造线段树根节点1,表示的区间范围 [1,maxn]while(~scanf("%s",str)&&strcmp(str,"End")){scanf("%d%d",&a,&b);if(str[0]=='Q')printf("%d\n",query(1,a,b));if(str[0]=='A'){num[a]+=b;update(1,a,num[a]);}if(str[0]=='S'){num[a]-=b;update(1,a,num[a]);}}}return 0;
}

树状数组:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n;
int peo[500050];
int lowbit(int x)
{return x&(-x);
}
void add(int val,int x,int y)
{while(x<=y){peo[x]=peo[x]+val;x=x+lowbit(x);   }
}
int sum(int end)
{int ans=0;while(end>0){ans=ans+peo[end];end=end-lowbit(end);}return ans;
}
int main()
{int t;scanf("%d",&t);for(int k=1;k<=t;k++){printf("Case %d:\n",k);scanf("%d",&n);int m;memset(peo,0,sizeof(peo));for(int i=1;i<=n;i++){scanf("%d",&m);add(m,i,n);}//建立一个树状数组;char s[10];while(1){scanf("%s",s);if(strcmp("End",s)==0)break;else if(strcmp("Add",s)==0){int x,y;scanf("%d%d",&x,&y);add(y,x,n);}else if(strcmp("Sub",s)==0){int x,y;scanf("%d%d",&x,&y);add(-y,x,n);}else if(strcmp("Query",s)==0){int x,y;scanf("%d%d",&x,&y);int ans=sum(y)-sum(x-1);printf("%d\n",ans);}}    }   return 0;
}

A - 敌兵布阵(线段树)(单点更新区间求和)相关推荐

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

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

  2. hdu4417:线段树单点更新区间求和,离线 Super Mario

    Description Mario is world-famous plumber. His "burly" figure and amazing jumping ability ...

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

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

  4. hdu1166 敌兵布阵 线段树

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  5. 敌兵布阵 线段树

    敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Li ...

  6. Hud 敌兵布阵 --线段树的插点问线

    每个树存放的事左右端点的的总和,然后再递归往下分成更小的区间,根据着2*t是下一层节点的节点端点是(left,left+right)/2);2*t+1是右节点的区间是(left+right)/2+1, ...

  7. HDU1166 敌兵布阵 [线段树模板]

    题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...

  8. hdu 1540(线段树单点更新 区间合并)

    解题思路:这一题要求的是连续区间,所以可以把它的子区间合并,这里运用线段树,但是在保存节点信息的方面要做一点修改 lsum:从这个区间的左端点往右能够找到的最大连续区间: rsum:从这个区间的右端点 ...

  9. 题目敌兵布阵-------线段树(单点修改查询,区间修改查询)

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  10. A - 敌兵布阵(线段树模版题)

    传送门 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情 ...

最新文章

  1. Windows server2008 搭建ASP接口访问连接oracle数据库全过程记录--备用
  2. CondaHTTPError: HTTP 404 NOT FOUND for url https://pypi.tuna.tsinghua.edu.cn/simple/ 错误
  3. 『全球化产品』应该要避开的几个坑
  4. linux+卸载+gpm服务,Linux gpm下console中使用鼠标
  5. 记事本贪吃蛇游戏代码_厉害了,程序员28行代码写贪吃蛇游戏,附源码!
  6. java 选中指定文件_Java如何打开一个文件夹并选中指定文件
  7. 成龙表演、胡海泉当司仪、张柏芝送礼物,这场婚礼花销7千万 最后倒赚6千万!...
  8. Axure+SVN——实现多人团队开发
  9. k8s核心技术-资源编排(yaml)的编写方式---K8S_Google工作笔记0019
  10. hibernate面试问题_Hibernate面试问答
  11. 数据协作如何解决大数据的大问题
  12. 2002. [HNOI2010]弹飞绵羊【LCT】
  13. 【SpringBoot_ANNOTATIONS】组件注册 03 FilterType
  14. UG基本命令ug快捷键命令大全ug基本命令教程完整版
  15. 机器人操作系统二 ROS2:设计、架构和野外使用 - 机器翻译
  16. FAT32 文件系统 实践
  17. 时钟指针角度。【问题描述】普通时钟都有时针和分针。在任意时刻,时针和分针都有一个夹角,并且假设时针和分针都是连续移动的。现已知当前的时刻,试求出在该时刻时针和分针的夹角A(0≤A≤180)。
  18. 小学用计算机画画的课件,小学信息技术绘图课件
  19. Mach-O文件, 架构包framework的合并和拆分
  20. 2017-2020(4周年)读书年度总结及书单

热门文章

  1. 剖析Disruptor:为什么会这么快?(一)Ringbuffer的特别之处
  2. Kubernetes - - k8s - v1.12.3 持久化部署 GitLab 集成 OpenLDAP 登录
  3. 小红书创始人瞿芳回应裁员风波:战略部署清晰 人员翻倍
  4. 关于ARM指令中位置无关和位置相关代码的认识【转】
  5. audio.js的研究与使用
  6. andrioid 图像视频处理
  7. shell脚本使用getopts自定义传入参数选项
  8. Linux 下DNS服务配置
  9. 设计模式之建造者(builder)模式
  10. myeclipse 发布 web 项目后 tomcat 无法正常启动