士兵杀敌(二)

时间限制:1000 ms  |           内存限制:65535 KB
难度:5
描述

南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。

小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。

南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。

输入
只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数。(1<M<100000) 随后的一行是N个整数,ai表示第i号士兵杀敌数目。(0<=ai<=100) 随后的M行每行是一条指令,这条指令包含了一个字符串和两个整数,首先是一个字符串,如果是字符串QUERY则表示南将军进行了查询操作,后面的两个整数m,n,表示查询的起始与终止士兵编号;如果是字符串ADD则后面跟的两个整数I,A(1<=I<=N,1<=A<=100),表示第I个士兵新增杀敌数为A.
输出
对于每次查询,输出一个整数R表示第m号士兵到第n号士兵的总杀敌数,每组输出占一行
样例输入
5 6
1 2 3 4 5
QUERY 1 3
ADD 1 2
QUERY 1 3
ADD 2 3
QUERY 1 2
QUERY 1 5
样例输出
6
8
8
20线段树:
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAX(x,y)(x>y?x:y)
 7 #define MIN(x,y)(x<y?x:y)
 8 #define lson root<<1,l,mid
 9 #define rson root<<1|1,mid+1,r
10 #define NOW tree[root].val=tree[root<<1].val+tree[root<<1|1].val;
11 #define L tree[root].l
12 #define R tree[root].r
13 #define V tree[root].val
14 //#define LOCAL
15 const int INF=0x3f3f3f3f;
16 const int MAXN=1000010;
17 struct Node{
18     int l,r,val;
19 };
20 int X,Y,ans;
21 Node tree[MAXN<<2];
22 void build(int root,int l,int r){
23     L=l;R=r;
24     if(l==r)scanf("%d",&V);
25     else{
26         int mid=(l+r)>>1;
27         build(lson);
28         build(rson);
29         NOW;
30     }
31 }
32 void update(int root){
33     if(L==X&&R==X)V+=Y;
34     else{
35         int mid=(L+R)>>1;
36         if(mid>=X)update(root<<1);
37         else update(root<<1|1);
38         NOW;
39     }
40 }
41 void query(int root){
42     if(L>=X&&R<=Y)ans+=V;
43     else{
44         int mid=(L+R)>>1;
45         if(mid>=X)query(root<<1);
46         if(mid<Y)query(root<<1|1);
47     }
48 }
49 void input(){
50     char s[10];
51     int N,M;
52     scanf("%d%d",&N,&M);
53     build(1,1,N);
54     while(M--){
55         scanf("%s%d%d",s,&X,&Y);
56         if(!strcmp(s,"ADD"))update(1);
57         else{
58             ans=0;
59             query(1);
60             printf("%d\n",ans);
61         }
62     }
63 }
64 int main(){
65     #ifdef LOCAL
66     freopen(data.in,"r",stdin);
67     freopen(data.out,"w",stdout);
68     #endif
69     input();
70     return 0;
71 }

树状数组:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAX(x,y)(x>y?x:y)
 7 #define MIN(x,y)(x<y?x:y)
 8 //#define LOCAL
 9 const int INF=0x3f3f3f3f;
10 const int MAXN=1000010;
11 int tree[MAXN];
12 int N;
13 int lowbit(int x){
14     return x&(-x);
15 }
16 void update(int x,int y){
17     while(x<=N){
18         tree[x]+=y;
19         x+=lowbit(x);
20     }
21 }
22 int query(int x){
23     int ans=0;
24     while(x){
25         ans+=tree[x];
26         x-=lowbit(x);
27     }
28     return ans;
29 }
30 int main(){
31     #ifdef LOCAL
32     freopen(data.in,"r",stdin);
33     freopen(data.out,"w",stdout);
34     #endif
35     int M;
36     scanf("%d%d",&N,&M);
37     int a,b;
38     for(int i=1;i<=N;i++){
39         scanf("%d",&a);
40         update(i,a);
41     }
42     char s[10];
43     while(M--){
44         scanf("%s",s);
45         scanf("%d%d",&a,&b);
46         if(!strcmp(s,"ADD"))update(a,b);
47         else
48         printf("%d\n",query(b)-query(a-1));
49     }
50     return 0;
51 }

转载于:https://www.cnblogs.com/handsomecui/p/4893092.html

士兵杀敌(二)(线段树+树状数组)相关推荐

  1. NYOJ 116士兵杀敌(二) 树状数组

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=116 士兵杀敌(一) 数组是固定的,所以可以用一个sum数组来保存每个元素的和就行,但是不 ...

  2. 蓝桥杯算法训练合集三 1.车的位置2.24点3.最大分解4.RP大冒险5.士兵杀敌(二)

    目录 1.车的位置(搜索) 2.24点(搜索) 3.最大分解(贪心) 4.RP大冒险 5.士兵杀敌(二) 1.车的位置(搜索) 问题描述 在一个n*n的棋盘中,每个格子中至多放置一个车,且要保证任何两 ...

  3. NYOJ 士兵杀敌(四) 树状数组

    士兵杀敌(四) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军麾下有百万精兵,现已知共有M个士兵,编号为1~M,每次有任务的时候,总会有一批编号连在一起人请战(编 ...

  4. NYOJ 116 士兵杀敌(二)

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...

  5. 树状数组详解(超详细)(完整代码在四 五最后)

    一,树状数组的优点 前缀和的思想,可以通过O(n)的预处理,使得多次查询区间值都是o(1),但只能解决不修改,多次查询的问题. 差分思想,能通过差分数组,将区间修改变成O(1)的,最后通过一次O(n) ...

  6. nyoj116 士兵杀敌(二)树状数组 插点问线

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...

  7. NYOJ 士兵杀敌(二) 树状数组

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知 ...

  8. POJ-2155 Matrix 二维线段树 | 树状数组

    题目链接:http://poj.org/problem?id=2155 比较典型的二维线段树题目,直接永久更新即可,在询问的时候,要询问每个x区间的子树,复杂度O(log(n)^2). 也可以用树状数 ...

  9. BZOJ.4553.[HEOI2016TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j)if(a[j ...

最新文章

  1. 普通域账号客户端计算无关机选项
  2. 三星s10android10功能,三星S10系列现场上手体验:“安卓机皇”真的名副其实
  3. ubuntu16.04上安装graphy-easy
  4. 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用
  5. 零基础学Python-爬虫-3、利用CSS选择器爬取整篇网络小说
  6. ES6 generator
  7. 【ZJOF】用来个栈来实现一个队列
  8. jvm锁_JVM如何处理锁
  9. php小程序onload,微信小程序 loading 组件实例详解
  10. 斑马打印机客户端GET和POST,以及后端两种打印方式。
  11. 品质生活在于细节 8月6日张朝阳“做饭直播”带货厨房好物
  12. 平面/UI设计师社区网站集设网|让你作品开始发光
  13. Macos 12 打不开微信解决方案
  14. SAP License:AM手工折旧计算外折旧
  15. 微信小程序icon图标使用详解
  16. 和“目标”相关的名言
  17. 计算机网络对青少年的影响,计算机网络对中学生的影响及对策研究
  18. sketch插件 android,Sketch 插件大集合
  19. git bash安装SDKman遇到需要安装zip的问题
  20. 笔记本电脑实现内外网双通成功经验分享(内网用有线,外网用无线)

热门文章

  1. golang中的strings.EqualFold
  2. 什么事孤儿进程和僵死进程?
  3. 嵌入式中常见的几个死循环:
  4. BootStrap的下载及使用方法
  5. 汇编: 用int中断改变ip,实现loop循环
  6. Oracle: 数字前面自动补0几种方式
  7. pyqt5中信号与槽的认识
  8. 大数据之Linux早课9.21
  9. 《王者荣耀》技术总监复盘回炉历程:没跨过这三座大山,就是另一款MOBA霸占市场了...
  10. 系统集成知识点整理(五)质量管理