// 2021-1-ora-oranzada.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
constexpr int MAXN = 1e6;
constexpr int DOD = 1 << 20;
constexpr int SIZ = 2 * DOD + 7;
bool occured[MAXN];
bool taken[MAXN];
int t[MAXN];
int arr[MAXN];
int tree[SIZ];
void tree_incr(int p)
{
p += DOD;
while (p > 0)
{
tree[p]++;
p /= 2;
}
}
long long tree_get(int b, int e)
{
b += DOD;
e += DOD;
if (b==e)
{
return tree[b];
}
int answ = 0;
while (b/2 < e/2)
{
if (b%2==0)
{
answ += tree[b + 1];
}
if (e%2==1)
{
answ += tree[e - 1];
}
b /= 2;
e /= 2;
}
return answ;
}
long long count_swaps(int n)
{
long long answ = 0;
for (size_t i = 0; i < n; i++)
{
answ += tree_get(arr[i], n + 7);
tree_incr(arr[i]);
}
return answ;
}
int main()
{
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
int n, k, cnt = 1;
std::cin >> n >> k;
for (size_t i = 0; i < n; i++)
{
std::cin >> t[i];
if (!occured[t[i]] && cnt <= k)
{
taken[i] = true;
occured[t[i]] = true;
arr[i] = cnt;
cnt++;
}
}
if (cnt <= k)
{
std::cout << "-1\n";
return 0;
}
for (size_t i = 0; i < n; i++)
{
if (!taken[i])
{
arr[i] = cnt;
cnt++;
}
}
std::cout << count_swaps(n) << '\n';
}
// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu
// Tips for Getting Started:
// 1. Use the Solution Explorer window to add/manage files
// 2. Use the Team Explorer window to connect to source control
// 3. Use the Output window to see build output and other messages
// 4. Use the Error List window to view errors
// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | // 2021-1-ora-oranzada.cpp : This file contains the 'main' function. Program execution begins and ends there. // #include <iostream> constexpr int MAXN = 1e6; constexpr int DOD = 1 << 20; constexpr int SIZ = 2 * DOD + 7; bool occured[MAXN]; bool taken[MAXN]; int t[MAXN]; int arr[MAXN]; int tree[SIZ]; void tree_incr(int p) { p += DOD; while (p > 0) { tree[p]++; p /= 2; } } long long tree_get(int b, int e) { b += DOD; e += DOD; if (b==e) { return tree[b]; } int answ = 0; while (b/2 < e/2) { if (b%2==0) { answ += tree[b + 1]; } if (e%2==1) { answ += tree[e - 1]; } b /= 2; e /= 2; } return answ; } long long count_swaps(int n) { long long answ = 0; for (size_t i = 0; i < n; i++) { answ += tree_get(arr[i], n + 7); tree_incr(arr[i]); } return answ; } int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int n, k, cnt = 1; std::cin >> n >> k; for (size_t i = 0; i < n; i++) { std::cin >> t[i]; if (!occured[t[i]] && cnt <= k) { taken[i] = true; occured[t[i]] = true; arr[i] = cnt; cnt++; } } if (cnt <= k) { std::cout << "-1\n"; return 0; } for (size_t i = 0; i < n; i++) { if (!taken[i]) { arr[i] = cnt; cnt++; } } std::cout << count_swaps(n) << '\n'; } // Run program: Ctrl + F5 or Debug > Start Without Debugging menu // Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started: // 1. Use the Solution Explorer window to add/manage files // 2. Use the Team Explorer window to connect to source control // 3. Use the Output window to see build output and other messages // 4. Use the Error List window to view errors // 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project // 6. In the future, to open this project again, go to File > Open > Project and select the .sln file |
English