nyoj116 士兵杀敌(二)(线段树)

来源:互联网 发布:淘宝原单好店推荐豆瓣 编辑:程序博客网 时间:2024/04/29 21:08

士兵杀敌(二)

时间限制: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
样例输出
688

20


单点更新。

#include <iostream>#include<algorithm>#include <cstdio>#include <cstring>#define MAXN 1000010using namespace std;int array[MAXN];int segT[MAXN * 4 + 10];void build(int node, int begin, int end) {if(begin == end) {segT[node] = array[begin];}else {build(node * 2, begin, (begin + end) / 2);build(node * 2 + 1, (begin + end) / 2 + 1, end);segT[node] = segT[node * 2] + segT[node * 2 + 1];}}int query(int node, int begin, int end, int l, int r) {if(begin == l && end == r) {return segT[node];}else {int mid = (begin + end) / 2;if(r <= mid) return query(node * 2, begin, mid, l, r);else if(l > mid) return query(node * 2 + 1, mid + 1, end, l, r);else return query(node * 2, begin, mid, l, mid) + query(node * 2 + 1, mid + 1, end, mid + 1, r);}}void updata(int node, int begin, int end, int id, int add) {   //单点更新 if(begin == end) {//最后一定能根据这个条件找到一个点,而这个点就是id segT[node] += add;}else {int mid = (begin + end) / 2;if(id <= mid) updata(node * 2, begin, mid, id, add);// 根据id找点在线段树上的位置 else updata(node * 2 + 1, mid + 1, end, id, add);segT[node] = segT[node * 2] + segT[node * 2 + 1];    //更新父节点 }}int main() {    int N, M;    scanf("%d %d", &N, &M);    int i;    for(i = 1; i <= N; i++) {    scanf("%d", &array[i]);}build(1, 1, N);char ch[10];int l, r;while(M--) {scanf("%s", ch);scanf("%d %d", &l, &r);if(strcmp(ch, "QUERY") == 0) printf("%d\n", query(1, 1, N, l, r));else updata(1, 1, N, l, r);}    return 0;}


0 0
原创粉丝点击