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
|
auto solve(int n) {
std::vector<int> a(n * n), b(n * n);
for (auto& x : a)
std::cin >> x;
for (auto& x : b)
std::cin >> x;
a.erase(rgs::find(a, 0));
b.erase(rgs::find(b, 0));
std::function<void(int,int,std::vector<int>&,std::vector<int>&,i64&)> merge = [&merge](int l, int r, std::vector<int>& a, std::vector<int>& b, i64& ans) -> void {
if (r - l <= 1)
return;
auto mid = (l + r) / 2;
auto i = l, j = mid, k = l;
merge(l, mid, a, b, ans), merge(mid, r, a, b, ans);
while (i < mid and j < r) {
if (a[i] <= a[j]) {
b[k++] = a[i++];
} else {
b[k++] = a[j++];
ans += mid - i;
}
}
while (i < mid)
b[k++] = a[i++];
while (j < r)
b[k++] = a[j++];
for (auto t = l; t < r; t ++)
a[t] = b[t];
};
auto cnta = 0ll, cntb = 0ll;
auto tmpa = std::vector<int>(a.size());
auto tmpb = std::vector<int>(b.size());
merge(0, a.size(), a, tmpa, cnta);
merge(0, b.size(), b, tmpa, cntb);
if (cnta % 2 == cntb % 2)
std::cout << "TAK" << endl;
else
std::cout << "NIE" << endl;
}
|