• nyoj 123 士兵杀敌(四)【树状数组】+【插线问点】


    树状数组有两种情况:插点问线和插线问点。这道题是插线问点。

    由于树状数组最简单的作用是计算1~x的和,所以给出(a, b。 c)。表示(a,b)区间添加c, 那我们仅仅须要在a点原来的基础上添加c,然后在b点原来的基础上更新-c,这样我们算终于结果的时候在(a。 b)之间的就是添加了c。在区间之外的就是没有添加。

    代码:

    #include <stdio.h>
    #include <string.h>
    #define M 1000005
    int c[M], m;
    
    int lowbit(int x){
    	return x&(-x);
    }
    
    int getsum(int x){
    	int sum = 0;
    	while(x){
    		sum += c[x];
    		x -= lowbit(x);
    	}
    	return sum;
    }
    
    void add(int x, int val){
    	while(x <= m){
    		c[x] += val;
    		x += lowbit(x);
    	}
    }
    
    int main(){
    	int t;
    	scanf("%d%d", &t, &m);
    	memset(c, 0, sizeof(c));
    	char s[9];
    	int a, b, c;
    	while(t --){
    		scanf("%s", s);
    		if(s[0] == 'A'){
    			scanf("%d%d%d", &a, &b, &c);
    			add(a, c);
    			add(b+1, -c);
    		}
    		else{
    			scanf("%d", &a);
    			printf("%d
    ", getsum(a));
    		}
    	}
    }  

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=123


  • 相关阅读:
    k8s nod rc service 使用
    Linux $() 与 ${}
    Linux set
    Linux 上传下载 rz 与sz
    Linux !的使用
    K8s创建pod yaml文件详解
    Kubernetes 安装
    Python 生成器
    k8s 使用详解
    微信 网页授权
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6937562.html
Copyright © 2020-2023  润新知