//Mateusz Piórkowski
#include <iostream>
#include <vector>
#include <set>
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
int n, k;
std::cin >> n >> k;
int* butelki = new int[n];
std::set<int> marki;
for(int i=0; i<n; i++){ //Get marki and butelki
int marka;
std::cin >> marka;
butelki[i] = marka;
marki.insert(marka);
}
if(marki.size() < k){
std::cout << -1 << "\n";
return 0;
}
int* pierwsza_pos = new int[n]; //First position marki
for(int i=0; i<n; i++) pierwsza_pos[i]=-1;
int64_t output=0;
int marki_na_skraju=0;
for(int i=0; i<n; i++){
int marka = butelki[i];
if(pierwsza_pos[marka-1] == -1){ //First
pierwsza_pos[marka-1] = i;
if(i>=k){ //Nie na skraju
output+=i;
marki_na_skraju+=1;
}else{ //Na skraju
marki_na_skraju+=1;
}
if(marki_na_skraju==k){ //Tyle marek ile miało być
std::cout << output << "\n";
return 0;
}
}else{ //Repeated
if(i<k){ //Na skraju
output-=i;
}
}
}
/*std::cout << "Butelki:\n";
for(int i=0; i<n; i++){
std::cout << butelki[i] << "\n";
}
std::cout << "Marki:\n";
for(int i : marki){
std::cout << i << "\n";
}
std::cout << "Pierwsza_pos:\n";
for(int i=0; i<marki.size(); i++){
std::cout << pierwsza_pos[i] << "\n";
}*/
std::cout << output << "\n";
}
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 | //Mateusz Piórkowski #include <iostream> #include <vector> #include <set> int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n, k; std::cin >> n >> k; int* butelki = new int[n]; std::set<int> marki; for(int i=0; i<n; i++){ //Get marki and butelki int marka; std::cin >> marka; butelki[i] = marka; marki.insert(marka); } if(marki.size() < k){ std::cout << -1 << "\n"; return 0; } int* pierwsza_pos = new int[n]; //First position marki for(int i=0; i<n; i++) pierwsza_pos[i]=-1; int64_t output=0; int marki_na_skraju=0; for(int i=0; i<n; i++){ int marka = butelki[i]; if(pierwsza_pos[marka-1] == -1){ //First pierwsza_pos[marka-1] = i; if(i>=k){ //Nie na skraju output+=i; marki_na_skraju+=1; }else{ //Na skraju marki_na_skraju+=1; } if(marki_na_skraju==k){ //Tyle marek ile miało być std::cout << output << "\n"; return 0; } }else{ //Repeated if(i<k){ //Na skraju output-=i; } } } /*std::cout << "Butelki:\n"; for(int i=0; i<n; i++){ std::cout << butelki[i] << "\n"; } std::cout << "Marki:\n"; for(int i : marki){ std::cout << i << "\n"; } std::cout << "Pierwsza_pos:\n"; for(int i=0; i<marki.size(); i++){ std::cout << pierwsza_pos[i] << "\n"; }*/ std::cout << output << "\n"; } |
English