802.离散化
作者:互联网
假定有一个无限长的数轴,数轴上每个坐标上的数都是0。
现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。
接下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。
输入格式
第一行包含两个整数n和m。
接下来 n 行,每行包含两个整数x和c。
再接下里 m 行,每行包含两个整数l和r。
输出格式
共m行,每行输出一个询问中所求的区间内数字和。
数据范围
−109≤x≤109,
1≤n,m≤105,
−109≤l≤r≤109,
−10000≤c≤10000
输入样例:
3 3
1 2
3 6
7 5
1 3
4 6
7 8
输出样例:
8
0
5
参考代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
class Pair {
public int first;
public int second;
public Pair(int first, int second) {
this.first = first;
this.second = second;
}
}
public class Main {
public static int find(List<Integer> list, int x) {
int l = 0, r = list.size() - 1;
while (l < r) {
int mid = l + r >> 1;
if (list.get(mid) >= x) {
r = mid;
} else {
l = mid + 1;
}
}
return l + 1;
}
public static int unique(List<Integer> list) {
int j = 0;
for (int i = 1; i < list.size(); i++) {
if (list.get(i) != list.get(j)) {
list.set(++j, list.get(i));
}
}
return j + 1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[] a = new int[n + 2 * m + 1];
int[] s = new int[n + 2 * m + 1];
List<Pair> list = new ArrayList<>();
List<Pair> query = new ArrayList<>();
List<Integer> key = new ArrayList<>();
for (int i = 0; i < n; i++) {
int x = sc.nextInt();
int c = sc.nextInt();
list.add(new Pair(x, c));
key.add(x);
}
for (int i = 0; i < m; i++) {
int l = sc.nextInt();
int r = sc.nextInt();
query.add(new Pair(l, r));
key.add(l);
key.add(r);
}
Collections.sort(key);
key = key.subList(0, unique(key));
for (Pair item : list) {
int index = find(key, item.first);
a[index] += item.second;
}
for (int i = 1; i <= key.size(); i++) {
s[i] = s[i - 1] + a[i];
}
for (Pair item : query) {
int l = find(key, item.first);
int r = find(key, item.second);
System.out.println(s[r] - s[l - 1]);
}
sc.close();
}
}
标签:int,list,离散,key,new,sc,802,public 来源: https://www.cnblogs.com/pannnn/p/13785444.html