-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3020.cpp
More file actions
executable file
·70 lines (64 loc) · 1.42 KB
/
Copy path3020.cpp
File metadata and controls
executable file
·70 lines (64 loc) · 1.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
* 最小堆
* 加多少个零需要思考
**/
#include <iostream>
#define ll long long
using namespace std;
ll M, N;
ll F[101000], ans;
void down(ll rt, ll size) {
ll tmp = F[rt];
if((rt << 1) > size) return;
else if((rt << 1 | 1) > size) {
if(tmp > F[rt << 1]) {
F[rt] = F[rt << 1];
F[rt << 1] = tmp;
}
return;
} else {
ll chi1 = F[rt << 1], chi2 = F[rt << 1 | 1];
if(chi1 < tmp && chi1 <= chi2) {
F[rt] = chi1;
F[rt << 1] = tmp;
down(rt << 1, size);
} else if(chi2 < tmp && chi2 <= chi1) {
F[rt] = chi2;
F[rt << 1 | 1] = tmp;
down(rt << 1 | 1, size);
}
}
}
void build() {
for(ll i = N / 2;i > 0;-- i) {
down(i, N);
}
}
void op(ll size) {
ll tmp = 0;
for(ll i = 1;i < M;++ i) {
tmp += F[1];
F[1] = F[size];
down(1, -- size);
}
tmp += F[1];
ans += tmp;
F[1] = tmp;
down(1, size);
}
int main() {
scanf("%lld%lld", &N, &M);
for(ll i = 1;i <= N;++ i) scanf("%lld", &F[i]);
ll tmp = M;
while(tmp <= N) tmp *= M;
tmp /= M;
if((N - tmp) * M % (M - 1)) tmp = (N - tmp) * M / (M - 1) + 1;
else tmp = (N - tmp) * M / (M - 1);
tmp = M - tmp % M;
if(tmp != M) N += tmp;
build();
for(ll i = 0;i < N - 1;i += (M - 1)) {
op(N - i);
}
cout << ans << endl;
}