参考的大佬的代码:评论区惊现大佬,我是传送门
代码具体步骤
-
读取数据,下标个数n,区间个数m。
-
创建集合
TreeMap<Integer,Integer> map
,存储初始的下标、数值组成的数对。
注意:TreeMap是有序的,按照key大小排序,如果key值使用的是自定义类型,那么需要重写compareTo()方法 -
读取n组数据,使用
map.put(x,getOrDefault(x,0) + c
输入数据,并达到去重效果。getOrDefault(key, default)
:获取key对应的value,如果没有key,则返回默认值default。
map.getOrDefault(x, 0) + c
:将数轴下标key与c求和,得到新的value值,如果map中已经存在key为x的键值对,则将value值更新,否则在map中直接插入键值对即可。
-
遍历TreeMap集合,求前缀和。使用增强
for
循环可以获得各个键值对entry
for(Entry<Integer, Integer> entry : map.entrySet()){}
- 循环输入m个区间,求出每个区间的数据之和。
lowerEntry(key)
:方法返回映射中严格小于给定键的最大键及其对应的值。如果没有这样的键,则返回null。
floorEntry(key)
:方法的作用是返回映射中不大于给定键的最大键及其对应的值。如果没有这样的键,则返回null。
代码
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
TreeMap<Integer,Integer> map = new TreeMap<>();//排序
while(n-- > 0) {
int x = sc.nextInt();
int c = sc.nextInt();
map.put(x, map.getOrDefault(x, 0) + c);//去重
}
int sum = 0;
TreeMap<Integer,Integer> s = new TreeMap<>();//前缀和
for(Entry<Integer, Integer> entry : map.entrySet()) {
sum += entry.getValue();
s.put(entry.getKey(), sum);
}
while(m -- > 0) {
int l = sc.nextInt();
int r = sc.nextInt();
Entry<Integer,Integer> entryL = s.lowerEntry(l);//返回小于等于key的最大键的键值对
Entry<Integer,Integer> entryR = s.floorEntry(r);//返回大于等于key的最小键的键值对
int valueL = (entryL == null) ? 0 : entryL.getValue();
int valueR = (entryR == null) ? 0 : entryR.getValue();
System.out.println(valueR - valueL);
}
}
}