NYOJ116 士兵杀敌(二) 线段数、单点更新
来源:互联网 发布:时标网络计划图 编辑:程序博客网 时间:2024/05/13 02:19
南将军手下有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 <iostream>#include <cstdio>#include <map>#include <set>#include <vector>#include <queue>#include <stack>#include <cmath>#include <algorithm>#include <cstring>#include <string>using namespace std;#define INF 0x3f3f3f3ftypedef long long LL;struct node{ int l,r; LL sum; int mid(){ return (l+r)/2; }}tree[4000005];void buildtree(int root,int l,int r){ tree[root].l=l; tree[root].r=r; tree[root].sum=0; if(l==r){ return; } buildtree(2*root,l,tree[root].mid()); buildtree(2*root+1,tree[root].mid()+1,r);}void add(int root,int w,int q){ tree[root].sum+=q; if(tree[root].l==tree[root].r){ return; } if(w<=tree[root].mid()){ add(2*root,w,q); }else{ add(2*root+1,w,q); }}LL query(int root,int a,int b){ LL answer=0; if(tree[root].l==a&&tree[root].r==b){ return tree[root].sum; } if(b<=tree[root].mid()){ return query(2*root,a,b); }else if(a>tree[root].mid()){ return query(2*root+1,a,b); }else{ return query(2*root,a,tree[root].mid())+ query(2*root+1,tree[root].mid()+1,b); } return answer;}int main(){ int n,m,a,b; char ch[10]; scanf("%d%d",&n,&m); buildtree(1,1,n); for(int i=1;i<=n;i++){ scanf("%d",&b); add(1,i,b); } while(m--){ getchar(); scanf("%s%d%d",ch,&a,&b); if(ch[0]=='A'){ add(1,a,b); }else{ printf("%lld\n",query(1,a,b)); } } return 0;}
0 0
- NYOJ116 士兵杀敌(二) 线段数、单点更新
- nyoj116士兵杀敌(二)线段树单点更新
- NYOJ116 士兵杀敌(二)(线段树区单点更新,区间求和,zkw线段树)
- nyoj116 士兵杀敌(二)(线段树的区间查询和单点更新)
- NYOJ116 士兵杀敌(二) 单点更新+区间求和
- 【nyoj116】士兵杀敌二(线段树)
- NYOJ116 士兵杀敌(二)
- NYOJ116士兵杀敌(二)
- nyoj116 士兵杀敌(二)
- nyoj116 士兵杀敌(二)(线段树)
- nyoj116士兵杀敌(二)【线段树||树状数组】
- nyoj116 士兵杀敌(二)树状数组与线段树
- NYOJ 116 士兵杀敌(二)【线段树 单点更新】
- nyoj116士兵杀敌(二)
- NYOJ116 士兵杀敌(二)【树状数组】
- nyoj116——士兵杀敌(二)
- nyoj-士兵杀敌 二 线段树单点更新
- ny 116 士兵杀敌(二) -- 线段树(单点更新,区间求和)
- Spring MVC整理系列(01)————请求流程分析
- md5加密
- Java 快速排序
- maximum continuous drop
- java获取文件夹下所有文件的名称
- NYOJ116 士兵杀敌(二) 线段数、单点更新
- (OK)(OK) port mptcp on Android-x86-kernel-4.4.12 (SUCCESS)
- JS正则表达式——语法详解(一)
- 程序人生之七:我的 2010
- 此证书的签发者无效Missing iOS Distribution signing identity问题解决
- LINQ基础
- Android中解析读取复杂word,excel,ppt等的方法
- 贪心算法与活动选择问题和背包问题
- 【华为 OJ】 计算字符个数