• 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<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int num[1000010];
    int main()
    {
    	int  m,n;
    	scanf("%d%d",&n,&m);
    	int a,b;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&a);
    		int j=i;
    		while(j<=n)
    		{
    			num[j]+=a;
    			j+=j&(-j);
    		}
    	}
    	while(m--)
    	{
    		char op[10];
    		scanf("%s",op);
    		if(op[0]=='Q')
    		{
    			int s,e,s1=0,s2=0;
    			scanf("%d%d",&s,&e);
    			s-=1;
    			while(s>=1)
    			{
    				s1+=num[s];
    				s-=s&(-s);
    			}
    			while(e>=1)
    			{
    				s2+=num[e];
    				e-=e&(-e);
    			}
    			printf("%d
    ",s2-s1);
    		}
    		else
    		{
    			int s,j;
    			scanf("%d%d",&s,&j);
    			while(s<=n)
    			{
    				num[s]+=j;
    				s+=s&(-s);
    			}
    		}
    	}
    	return 0;
    }



  • 相关阅读:
    loadrunner-3-19LR常见函数
    loadrunner-3-18Service-Level Agreement(服务水平协议)
    loadrunner-3-15IP欺骗
    loadrunner-3-14集合点
    Python 静态类型检查 mypy 示例
    JavaScript 中 == 和 === 的区别
    Python 一键安装全部依赖包
    TypeError: 'NoneType' object is not subscriptable
    前端开发神器 VSCode 使用总结
    Next.js 配置接口跨域代理转发
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273672.html
Copyright © 2020-2023  润新知