nyoj 123士兵杀敌(四)

来源:互联网 发布:编程一小时官网 编辑:程序博客网 时间:2024/05/20 20:01

题目大意:1~M个士兵,初始的时候,每个人的军工都是零,动态连续增加军工,动态查询某个人的军工!!

 

思路:由于是动态的,连续插入,单个查询,是典型的插线问点树状数组!!!

对于树状数组的lowBit()、update()和getSum(),多了也就理解了,南阳理工的一些列的《士兵杀敌》做完,理解会更好!

import java.io.BufferedInputStream;import java.util.Scanner;public class Main {static int[] arr = new int[1000005];static int len;public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int cases;String str;cases = sc.nextInt();len = sc.nextInt();while (cases-- > 0) {str = sc.next();if (str.charAt(0) == 'A') {//看java源码,这个效率高!int start = sc.nextInt();int end = sc.nextInt();int add = sc.nextInt();update(start, add);update(end + 1, -add);//插线问点,前面增加add,后面要去掉!} else {System.out.println(getNum(sc.nextInt()));}}sc.close();}static int lowBit(int x) {return -x & x;}static void update(int x, int add) {while (x <= len) {arr[x] += add;x += lowBit(x);}}static int getNum(int x) {int sum = 0;while (x > 0) {sum += arr[x];x -= lowBit(x);}return sum;}}


0 0
原创粉丝点击