#include <queue>
#include <vector>
using
namespace
std;
#define MODULO 1000000007
unsigned
long
long
solution(vector<
int
>& A)
{
unsigned
long
long
res = 0;
const
unsigned
int
len = (unsigned
int
)A.size();
queue<pair<unsigned
int
, unsigned
int
> > depot;
queue<unsigned
int
> depotOfEmpties;
vector<unsigned
int
> places(len, 0);
for
(unsigned
int
i = 0; i < len; i++) {
places.at(A.at(i) - 1)++;
}
for
(unsigned
int
i = 0; i < len; i++) {
if
(0 == places.at(i)) {
if
(depot.empty()) {
depotOfEmpties.push(i);
}
else
{
unsigned
int
distance = (i - depot.front().first);
res += distance;
res = res % MODULO;
depot.front().second--;
while
(!depot.empty() && depot.front().second < 1) {
depot.pop();
}
}
}
else
{
if
(1 == places.at(i)) {
continue
;
}
else
{
unsigned
int
pieces = places.at(i) - 1;
unsigned
int
lenEmptySequence = depotOfEmpties.size();
if
(pieces <= lenEmptySequence) {
for
(unsigned
int
j = 0; j < pieces; j++) {
res = (res + i - depotOfEmpties.front()) % MODULO;
depotOfEmpties.pop();
}
}
else
{
for
(unsigned
int
j = 0; j < lenEmptySequence; j++) {
res = (res + i - depotOfEmpties.front()) % MODULO;
depotOfEmpties.pop();
}
depot.push(pair<unsigned
int
, unsigned
int
>(i,
pieces - lenEmptySequence));
}
}
}
}
return
res;
}
int
solution(vector<
int
>& A, vector<
int
>& B)
{
unsigned
long
long
res = solution(B);
res += solution(A);
res = res % MODULO;
return
(
int
)res;
}
#include <iostream>
void
test(vector<
int
>& A, vector<
int
>& B,
int
expected,
bool
printAll =
false
,
bool
doNotPrint =
true
)
{
int
res = solution(A, B);
if
((expected != res && !doNotPrint) || printAll) {
for
(
size_t
i = 0; i < A.size(); i++) {
cout << A.at(i) <<
" "
;
}
cout << endl;
for
(
size_t
i = 0; i < B.size(); i++) {
cout << B.at(i) <<
" "
;
}
cout << endl;
if
(expected != res)
cout <<
"Error! Expected: "
<< expected <<
" "
;
else
cout <<
"Expected: "
<< expected <<
" "
;
}
cout <<
" Result: "
<< res << endl;
}
int
main()
{
int
A4[] = { 1, 2, 2, 3, 4 };
int
B4[] = { 1, 1, 4, 5, 4 };
vector<
int
> VA(A4, A4 + 5);
vector<
int
> VB(B4, B4 + 5);
test(VA, VB, 5);
int
A0[] = { 1, 1, 1, 1 };
int
B0[] = { 1, 2, 3, 4 };
VA = vector<
int
>(A0, A0 + 4);
VB = vector<
int
>(B0, B0 + 4);
test(VA, VB, 6);
int
A2[] = { 1, 1, 2 };
int
B2[] = { 1, 2, 1 };
VA = vector<
int
>(A2, A2 + 3);
VB = vector<
int
>(B2, B2 + 3);
test(VA, VB, 4);
int
A3[] = { 1, 2, 3, 1, 2, 3, 1, 2, 3 };
int
B3[] = { 1, 1, 1, 2, 2, 2, 3, 3, 3 };
VA = vector<
int
>(A3, A3 + 9);
VB = vector<
int
>(B3, B3 + 9);
test(VA, VB, 54);
int
A5[] = { 7, 8, 9, 7, 8, 9, 7, 8, 9 };
int
B5[] = { 7, 7, 7, 8, 8, 8, 9, 9, 9 };
VA = vector<
int
>(A5, A5 + 9);
VB = vector<
int
>(B5, B5 + 9);
test(VA, VB, 54);
int
A6[] = { 1, 1, 2, 3 };
int
B6[] = { 1, 2, 3, 4 };
VA = vector<
int
>(A6, A6 + 4);
VB = vector<
int
>(B6, B6 + 4);
test(VA, VB, 3);
test(VB, VA, 3);
int
A7[] = { 1, 1, 3, 5, 5 };
int
B7[] = { 1, 5, 3, 1, 5 };
VA = vector<
int
>(A7, A7 + 5);
VB = vector<
int
>(B7, B7 + 5);
test(VA, VB, 4);
test(VB, VA, 4);
int
A8[] = { 1, 2, 1, 2 };
int
B8[] = { 1, 1, 2, 2 };
VA = vector<
int
>(A8, A8 + 4);
VB = vector<
int
>(B8, B8 + 4);
test(VA, VB, 8);
int
A9[] = { 3, 4, 3, 4 };
int
B9[] = { 3, 3, 4, 4 };
VA = vector<
int
>(A9, A9 + 4);
VB = vector<
int
>(B9, B9 + 4);
test(VA, VB, 8);
int
A10[] = { 1, 2, 3, 4, 1, 2, 3, 4, 1,
2, 3, 4, 1, 2, 3, 4 };
int
B10[] = { 1, 1, 1, 1, 2, 2, 2, 2, 3,
3, 3, 3, 4, 4, 4, 4 };
VA = vector<
int
>(A10, A10 + 16);
VB = vector<
int
>(B10, B10 + 16);
test(VA, VB, 192);
int
A11[] = { 13, 14, 15, 16, 13, 14, 15,
16, 13, 14, 15, 16, 13, 14, 15, 16 };
int
B11[] = { 13, 13, 13, 13, 14, 14, 14,
14, 15, 15, 15, 15, 16, 16, 16, 16 };
VA = vector<
int
>(A11, A11 + 16);
VB = vector<
int
>(B11, B11 + 16);
test(VA, VB, 192);
return
0;
}