import
java.util.ArrayList;
class
KthMaxSumOverlappingListVersion {
public
static
void
main(String[] args)
{
int
[] ab = {
4
, -
8
,
9
, -
4
,
1
, -
8
, -
1
,
6
};
int
[] aa = { -
2
, -
3
,
4
, -
1
, -
2
,
1
,
5
, -
3
};
kthMaxSumOverlapping(ab, ab.length,
4
);
System.out.println();
kthMaxSumOverlapping(aa, aa.length,
3
);
}
static
void
maxMerge(ArrayList<Integer> max,
ArrayList<Integer> cand)
{
int
k = max.size();
int
j =
0
;
for
(
int
i =
0
; i < k; i++) {
if
(cand.get(j) > max.get(i)) {
max.add(i, cand.get(j));
max.remove(k);
j++;
}
}
}
static
void
minMerge(ArrayList<Integer> min,
int
ms)
{
for
(
int
i =
0
; i < min.size(); i++) {
if
(min.get(i) > ms) {
min.add(i, ms);
min.remove(min.size() -
1
);
break
;
}
}
}
static
void
kthMaxSumOverlapping(
int
[] aa,
int
n,
int
k)
{
ArrayList<Integer> max =
new
ArrayList<Integer>();
ArrayList<Integer> min =
new
ArrayList<Integer>();
ArrayList<Integer> cand =
new
ArrayList<Integer>();
int
[] prefixSum =
new
int
[n];
prefixSum[
0
] = aa[
0
];
for
(
int
i =
1
; i < n; i++)
prefixSum[i] = prefixSum[i -
1
] + aa[i];
for
(
int
i =
0
; i < k; i++) {
max.add(Integer.MIN_VALUE);
min.add(Integer.MAX_VALUE);
}
min.add(
0
,
0
);
min.remove(k);
for
(
int
i =
0
; i < n; i++) {
for
(
int
j =
0
; j < k; j++) {
cand.add(prefixSum[i] - min.get(j));
}
maxMerge(max, cand);
minMerge(min, prefixSum[i]);
cand.clear();
}
for
(
int
i =
0
; i < k; i++) {
System.out.print(max.get(i) +
" "
);
}
}
}