zoukankan      html  css  js  c++  java
  • NYOJ 116 士兵杀敌 (线段树,区间和)

    题目链接:NYOJ 116 士兵杀敌

    士兵杀敌(二)

    时间限制: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


    第一道自己独立完毕的线段树!!

    纪念一下。

    【源码】

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define L(m) m<<1
    #define R(m) m<<1|1
    using namespace std;
    int n,m;
    const int maxn = 1000000+1;
    int num[maxn];
    struct node{
    	int l,r,sum;
    }tree[maxn<<2]; //开4倍数组
    void Build(int m,int l,int r){
    	tree[m].l=l; tree[m].r=r; //赋初值
    	if(tree[m].l==tree[m].r)
    	{
    		tree[m].sum=num[l]; return ;//不要忘了return
    	}
    	int mid = (tree[m].l+tree[m].r)>>1;
    	Build(L(m),l,mid);  //递归构造左右子树
    	Build(R(m),mid+1,r);
    	tree[m].sum = tree[L(m)].sum+tree[R(m)].sum; //回溯。将子节点的sum加到父节点上
    }
    void Update(int m,int a,int x){
    	if(tree[m].l==a && tree[m].r==a){
    		tree[m].sum+=x; return ; //这个return 忘了写找了好久的错
    	}
    	int mid = (tree[m].l+tree[m].r)>>1;
    	// cout<<"bug"<<endl;
    	if(mid>=a)
    		Update(L(m),a,x);
    	else
    		Update(R(m),a,x);
    	tree[m].sum=tree[L(m)].sum+tree[R(m)].sum;
    }
    int Query(int m,int l,int r){
    	if(tree[m].l==l && tree[m].r==r){
    		return tree[m].sum;
    	}
    	int mid = (tree[m].l+tree[m].r)>>1;
    	if(mid>=r)                        //这里也能够写成 if else if else 
    		return Query(L(m),l,r);
    	if(mid<l)
    		return Query(R(m),l,r);
    	return Query(L(m),l,mid)+Query(R(m),mid+1,r);
    }
    int main(){
    	while(scanf("%d%d",&n,&m)!=EOF){
    		memset(tree,0,sizeof(tree));
    		for(int i=1;i<=n;i++)
    			scanf("%d",&num[i]);
    				Build(1,1,n);
    		char cmd[10]; int a ,b;
    		for(int i=0;i<m;i++){
    			scanf(" %s",cmd);
    			if(cmd[0]=='Q'){
    				scanf("%d%d",&a,&b);
    				printf("%d
    ",Query(1,a,b));
    			}
    			else{
    				scanf("%d%d",&a,&b);
    				Update(1,a,b);
    			}
    		}
    	}
    	return 0;
    }


  • 相关阅读:
    java基础_面试题笔记
    ACM-ICPC 2018 Xuzhou Online Contest题解
    覆盖点问题总结
    2018icpc沈阳网络赛题解(转发)
    树链剖分
    树状数组
    线段树板子
    sdoi2016生成魔咒
    洛谷3804
    大佬博文收集
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7384099.html
Copyright © 2011-2022 走看看