#include <cstdio>
#include
<climits>
#include
<cstdlib>
#include
<vector>
#include
<list>
using
namespace
std;
list
<
int
>::iterator group_pick(list<
int
> &player, list<
int
>::iterator &cur,
int
group_size, vector<
int
> &
W) {
int
wmax =
INT_MIN;
list
<
int
>::iterator ret =
player.end();
int
cnt =
group_size;
//
printf("check group:\n\t");
while
(cur != player.end() && cnt >
0
) {
--
cnt;
//
printf(" %d(%d)", *cur, W[*cur]);
if
(W[*cur] >=
wmax) {
wmax
= W[*
cur];
ret
=
cur;
}
cur
++
;
}
//
printf("\n");
return
ret;
}
int
main() {
int
N =
0
, G =
0
;
scanf(
"
%d%d
"
, &N, &
G);
if
(N <
1
)
return
0
;
vector
<
int
> W(N,
0
);
vector
<
int
> R(N,
0
);
vector
<
int
>
L;
list
<
int
>
P;
for
(
int
i=
0
; i<N; i++
) {
scanf(
"
%d
"
, &
W[i]);
}
for
(
int
i=
0
; i<N; i++
) {
int
t =
0
;
scanf(
"
%d
"
, &
t);
P.push_back(t);
}
int
level =
0
;
int
level_cnt =
0
;
list
<
int
>
tmp;
auto cur
=
P.begin();
//
number of elements in P should be larger than 1 to perform reduce processing
while
(G >
1
&& ++(cur = P.begin()) !=
P.end()) {
tmp.clear();
auto cur
=
P.begin();
while
(cur !=
P.end()) {
list
<
int
>::iterator fat =
group_pick(P, cur, G, W);
//
printf("pick %d\n", *fat);
tmp.splice(tmp.end(), tmp, fat);
}
swap(tmp, P);
auto iter
=
tmp.begin();
while
(iter !=
tmp.end()) {
R[
*(iter++)] =
level;
level_cnt
++
;
}
L.push_back(level_cnt);
level_cnt
=
0
;
level
++
;
}
//
now there must be only one element in P, the final winner
L.push_back(
1
);
R[P.front()]
=
level;
int
sum =
0
;
for
(
int
i=L.size() -
1
; i>=
0
; i--
) {
//
printf("level cnt: %d\n", L[i]);
int
next_sum = sum +
L[i];
L[i]
= sum +
1
;
sum
=
next_sum;
}
int
len =
R.size();
printf(
"
%d
"
, L[R[
0
]]);
for
(
int
i=
1
; i<len; i++
) {
printf(
"
%d
"
, L[R[i]]);
}
return
0
;
}
有点烦啊

