NYOJ112-士兵杀敌(2)-树状数组、线段树
来源:互联网 发布:淘宝信誉度查询 编辑:程序博客网 时间:2024/05/17 09:36
士兵杀敌(二)
时间限制: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 61 2 3 4 5QUERY 1 3ADD 1 2QUERY 1 3ADD 2 3QUERY 1 2QUERY 1 5
- 样例输出
68820
代码一:树状数组
#include<stdio.h>int c[1000000]={0};int lowbit(int k){return k&(k^(k-1));}//给柱状数组的某个结点增加值,沿途更新上面的结点 void add(int pos,int num,int n){while(pos<=n){c[pos]+=num;pos+=lowbit(pos);}}//求原序列的前n项和 int sum(int n) { int s =0; while(n>0){ s+=c[n]; n-=lowbit(n); } return s;}int main(){int n,m,i,x,y,k;char str[10];scanf("%d %d",&n,&m);for(i=1;i<=n;i++){scanf("%d",&k);add(i,k,n); }for(i=1;i<=m;i++){scanf("%s %d %d",str,&x,&y);if(str[0]=='Q'){printf("%d\n",sum(y)-sum(x-1));}else{add(x,y,n); }}return 0;}
代码二:线段树
#include<stdio.h>#define N 1000010struct node { int l,r; int value;}tree[N*3];void build(int p, int left, int right) { int mid,v; tree[p].l=left; tree[p].r=right; if(left==right){scanf("%d",&tree[p].value); return ; } v=p<<1; mid=(left+right)>>1; build(v,left,mid); build(v+1,mid+1,right); tree[p].value=tree[v].value+tree[v+1].value;}void updata(int p, int left, int right, int add) { int mid,v; if(tree[p].l==left&&tree[p].r==right) { tree[p].value+=add; return ; } tree[p].value+=add; v=p<<1; mid=(tree[p].l+tree[p].r)>>1; if(right<=mid) updata(v,left,right,add); else if(left>=mid+1) updata(v+1,left,right,add); else { updata(v,left,mid,add); updata(v+1,mid+1,right,add); }}int query(int p, int left, int right) { int mid,v; if(tree[p].l==left&&tree[p].r==right) return tree[p].value; v=p<<1; mid=(tree[p].l+tree[p].r)>>1; if(right<=mid) return query(v,left,right); else if(left>=mid+1) return query(v+1,left,right); else return query(v,left,mid) + query(v+1,mid+1,right);}int main() { int n,q,i,a,b; char s[10]; scanf("%d %d",&n,&q); build(1,1,n); for(i=0;i<q;i++) { scanf("%s %d %d",s,&a,&b); if(s[0]=='A') updata(1,a,a,b); else printf("%d\n",query(1,a,b)); } return 0;}
- NYOJ112-士兵杀敌(2)-树状数组、线段树
- nyoj108~士兵杀敌(一)(树状数组+线段树)
- NYOJ 士兵杀敌(三)(线段树,树状数组)
- NYOJ 116 士兵杀敌(二) 树状数组 & 线段树
- ny123 士兵杀敌(四)【线段树&&树状数组】
- nyoj116士兵杀敌(二)【线段树||树状数组】
- nyoj116 士兵杀敌(二)树状数组与线段树
- 士兵杀敌(树状数组)
- 【南理工oj】108 - 士兵杀敌(一)(线段树 & 树状数组)
- 【ny-oj】-108-士兵杀敌(一)(树状数组,线段树,基础)
- 【ny-oj】-116-士兵杀敌(二)(树状数组,线段树,基础)
- NYISTOJ 108 士兵杀敌(一) 树状数组或线段树
- ♥NYOJ 123-士兵杀敌(四)【线段树&&树状数组】
- NYOJ-士兵杀敌(四) 线段树、区间数、树状数组
- 【NYOJ 116】士兵杀敌(二) 【树状数组 or 线段树 】
- NYOJ 123士兵杀敌(四)【树状数组||区间树】
- 士兵杀敌(树状数组-插线问点)
- 士兵杀敌(树状数组-插点问线)
- 清除XCode缓存和生成文件
- 【lucene初学】lucene4.2.1
- 我理解的堆栈(stack)、动态内存分配与堆(heap)
- Android 判断应用程序是否已安装
- 【转载】深入探讨 Java 类加载器
- NYOJ112-士兵杀敌(2)-树状数组、线段树
- RTP与RTCP协议介绍
- linux修改系统时间详解
- Aptana3 使用不完全指南
- 【VS系列】开启工程MAP文件调试方法。。
- IOS 开源项目大全
- 【且听我说“镶嵌数据集建库”】5、原始影像管理流程及典型应用
- test
- 面向接口的编程(WCF)