题目描述
离散化思想
离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。
题解
1)创建需要用到的数组和集合
int N
= 300010;
int[] a
= new
int[N
];
int[] s
= new
int[N
];
List
<Integer
> alls
= new ArrayList
<>();
List
<Pairs
> add
= new ArrayList
<>();
List
<Pairs
> query
= new ArrayList
<>();
2)将题目用到的数据存入对应的集合里。 3)给集合alls进行排序和去重的操作 4)求前缀和
for (int i
= 1; i
<= alls
.size(); i
++) s
[i
] = s
[i
- 1] + a
[i
];
for (Pairs item
:query
) {
int l
= find(item
.first
, alls
);
int r
= find(item
.second
, alls
);
System
.out
.println(s
[r
] - s
[l
- 1]);
}
完整代码
import java
.util
.*
;
public class Main {
public static void main
(String
[] args
) {
Scanner sc
= new Scanner(System
.in
);
int n
= sc
.nextInt();
int m
= sc
.nextInt();
int N
= 300010;
int[] a
= new int[N
];
int[] s
= new int[N
];
List
<Integer> alls
= new ArrayList<>();
List
<Pairs> add
= new ArrayList<>();
List
<Pairs> query
= new ArrayList<>();
for (int i
= 0; i
< n
; i
++) {
int x
= sc
.nextInt();
int c
= sc
.nextInt();
add
.add(new Pairs(x
, c
));
alls
.add(x
);
}
for (int i
= 0; i
< m
; i
++) {
int l
= sc
.nextInt();
int r
= sc
.nextInt();
query
.add(new Pairs(l
, r
));
alls
.add(l
);
alls
.add(r
);
}
Collections
.sort(alls
);
int unique
= unique(alls
);
alls
= alls
.subList(0, unique
);
for (Pairs item
:add
) {
int index
= find(item
.first
, alls
);
a
[index
] += item
.second
;
}
for (int i
= 1; i
<= alls
.size(); i
++) s
[i
] = s
[i
- 1] + a
[i
];
for (Pairs item
:query
) {
int l
= find(item
.first
, alls
);
int r
= find(item
.second
, alls
);
System
.out
.println(s
[r
] - s
[l
- 1]);
}
}
static int unique(List
<Integer> list
) {
int j
= 0;
for (int i
= 0; i
< list
.size(); i
++) {
if (i
== 0 || list
.get(i
) != list
.get(i
- 1)) {
list
.set(j
, list
.get(i
));
j
++;
}
}
return j
;
}
static int find(int x
, List
<Integer> list
) {
int l
= 0;
int 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;
}
}
class Pairs {
int first
;
int second
;
public Pairs(int first
, int second
) {
this.first
= first
;
this.second
= second
;
}
}