AcWing 802. 区间和
原题链接
简单
作者:
火球大的脸盆
,
2023-09-27 16:27:45
,
所有人可见
,
阅读 35
再次复习离散化,每次复习,都有不一样的收获。曾经刚学算法的时候,我自作聪明为了省20w的空间,写了很多复杂的代码。现在看来,y总的做法真的简洁巧妙,虽然多了20w空间,但是减少了很多思维难度,而我当时却为了一点蝇头小利,多走弯路,并沾沾自喜,今天看来属实惭愧。还是要低下头,虚心学习,慢慢进步。下面奉献上我的Java代码。
Java的去重我是这样写的:alls = new ArrayList<>(new TreeSet<>(alls));
import java.io.*;
import java.util.ArrayList;
import java.util.Objects;
import java.util.TreeSet;
public class Main {
static final int N = 300010;
static int[] a = new int[N], s = new int[N];
static int n, m;
static ArrayList<Integer> alls = new ArrayList<>();
static ArrayList<Pair> add = new ArrayList<>(), query = new ArrayList<>();
static int find(int x) {
int l = 0, r = alls.size() - 1;
while (l < r) {
int mid = l + r >> 1;
if (alls.get(mid) >= x) r = mid;
else l = mid + 1;
}
return l;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] in = br.readLine().split(" ");
n = Integer.parseInt(in[0]);
m = Integer.parseInt(in[1]);
for (int i = 0; i < n; i++) {
int x, c;
in = br.readLine().split(" ");
x = Integer.parseInt(in[0]);
c = Integer.parseInt(in[1]);
add.add(new Pair(x, c));
alls.add(x);
}
alls.add(-2000000000);
for (int i = 0; i < m; i++) {
int l, r;
in = br.readLine().split(" ");
l = Integer.parseInt(in[0]);
r = Integer.parseInt(in[1]);
query.add(new Pair(l, r));
alls.add(l);
alls.add(r);
}
alls = new ArrayList<>(new TreeSet<>(alls));
for (Pair p : add) {
int x = p.x, c = p.y;
x = find(x);
a[x] += c;
}
for (int i = 1; i <= alls.size(); i++) s[i] = s[i - 1] + a[i];
for (Pair p : query) {
int l = p.x, r = p.y;
l = find(l);
r = find(r);
bw.write(String.format("%d\n", s[r] - s[l - 1]));
}
bw.flush();
}
}
class Pair {
public int x;
public int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Pair pair = (Pair) o;
return x == pair.x && y == pair.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}