#include <algorithm>
#include <iostream>
#include <queue>
#include <cstring>
#include <unordered_set> //unordered_set이 일반 set보다 속도가 빠름
using namespace std;
typedef long long ll;
int N, K;
int dx[2] = { 1, -1 };
queue<int> Q;
unordered_set<int> s;
ll BFS()
{
ll ans = 0, dis = 1;
while (!Q.empty())
{
int size = Q.size();
while (size--)
{
int housePos = Q.front();
Q.pop();
for (int i = 0; i < 2; i++)
{
int pos = housePos + dx[i];
if (!(s.count(pos) >= 1))
{
K--;
ans += dis;
s.insert(pos);
Q.push(pos);
if (K == 0)
return ans;
}
}
}
dis++;
}
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> K;
for (int i = 0; i < N; i++)
{
int a;
cin >> a;
Q.push(a);
s.insert(a);
}
cout << BFS() << "\n";
return 0;
}
BFS알고리즘을 사용하는 문제이며, 인접행렬을 이용하였다.
여기서 각 정점에서 연결된 간선이 2개(1, -1)씩이므로 총 개수는 O(2NK)인데 상수배는 무시할 수 있다. 또한 BFS탐색과정에서 정점을 O(NK)개 보고 간선도 O(NK)개 보니 O(NK+NK)=O(2NK)인데 상수배는 무시하므로, 시간복잡도는 O(NK)가 된다.