//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"; } |