士兵杀敌(二)

时间限制: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
线段树!
AC码:
#include<stdio.h>
int sum[3000000];
int a,b,t;
void Create(int L,int R,int root)
{if(L==R){scanf("%d",&sum[root]);return;}int mid=(L+R)/2;Create(L,mid,root*2);Create(mid+1,R,root*2+1);sum[root]=sum[root*2]+sum[root*2+1];
}
void Sum(int L,int R,int root)
{if(a>R||b<L)return;if(a<=L&&b>=R){t=t+sum[root];return;}int mid=(L+R)/2;Sum(L,mid,root*2);Sum(mid+1,R,root*2+1);
}
void Add(int L,int R,int root)
{if(a<L||a>R)return;if(a==L&&a==R){sum[root]+=b;return;}int mid=(L+R)/2;Add(L,mid,root*2);Add(mid+1,R,root*2+1);sum[root]=sum[root*2]+sum[root*2+1];
}
int main()
{int n,m,i;char str[7];scanf("%d%d",&n,&m);Create(1,n,1);for(i=1;i<=m;i++){scanf("%s%d%d",str,&a,&b);if(str[0]=='Q'){t=0;Sum(1,n,1);printf("%d\n",t);}else{Add(1,n,1);}}return 0;
}

树状数组!
AC码:
#include<stdio.h>
int a[1000002];
int n,m;
int lowbit(int t)
{return t & ( t ^ ( t - 1 ) ) ;
}
//执行add操作
void add(int i,int v)
{while(i<=n){a[i]+=v;i+=lowbit(i);}
}
//得到前i项和int sum(int i)
{int sum=0;while(i>0){sum+=a[i];i-=lowbit(i);}return sum;
}
void begin()  //根据树状数组的节点规律,初始化数组
{int t,i,j;for(i=n;i>=1;i--){t=0;for(j=i-lowbit(i)+1;j<=i;j++){t+=a[j];}a[i]=t;}
}
int main()
{int c,b,i,t;char s[6];scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&a[i]);begin();while(m--){scanf("%s %d %d",s,&c,&b);if(s[0]=='Q'){printf("%d\n", (sum(b) - sum(c-1)));    }else{add(c,b);}}return 0;
}

NYOJ 116 士兵杀敌(二)相关推荐

  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【士兵杀敌(二)】

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

  4. NYOJ -123 士兵杀敌(四)

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

  5. NYOJ 228 士兵杀敌(五)

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

  6. NYOJ 123 士兵杀敌(四)

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

  7. NYOJ 119 士兵杀敌(三)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比 ...

  8. NYOJ 108 士兵杀敌(一)

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

  9. NYOJ 108士兵杀敌(一)

    #include<stdio.h> #include<string.h> int c[1000001]; int main() {  int n,m,i,a,b;  scanf ...

最新文章

  1. BZOJ 3132 上帝造题的七分钟(二维树状数组)
  2. 2020-11-16(补码转换为无符号数)
  3. linux内核_查看Linux内核版本
  4. kafka 脚本发送_Kafka笔记归纳(第五部分:一致性保证,消息重复消费场景及解决方式)...
  5. grade java_Gradle Java 构建入门
  6. 【java】详解java多线程
  7. Java Script 学习笔记 -- Ajax
  8. hdu---1172猜数字
  9. .svc接口客户端调用_K8s:调用Java接口创建容器
  10. 团队作业——Alpha冲刺 4/12
  11. ImageLoader的简单分析(二)
  12. Luogu P2833 等式 我是傻子x2
  13. 简单好用的应用加密软件:Cisdem AppCrypt Mac版
  14. 微型计算机控制技术第三版第六章课后答案,(完整版)微型计算机控制技术第6章习题答案...
  15. AUTOCAD——坐标引线标注
  16. Java怎样实现验证码?
  17. 阿里云 centos7.2 安装openstack报错
  18. linux:挂载、rpm、yum、scp、ssh、crontab、时钟同步
  19. TOGAF(企业架构)
  20. CODEVS 2853 方格游戏

热门文章

  1. 干货盘点:神策数据深度用户案例传送门
  2. ?为什么要学这个技术(有什么优秀的地方,可以解决哪些问题?
  3. 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。...
  4. 本地突破XP系统权限
  5. Powershell管理系列(十一)Exchange完全访问权限邮箱的设置
  6. Ext的viewport在所有浏览器下出现界面内容消失的问题
  7. php 调用系统命令 执行外部程序
  8. Blockchain Meeting supporting papers
  9. 大概率有料的地方,大概率没有料的地方
  10. 年轻人对于“绰号”的认识