#include <iostream> using namespace std; void mergesort(int *tab, int p, int q, int *tab2, int *indeksy, int *indeksy2) { if(p<q) { int s=(p+q)/2; mergesort(tab, p, s, tab2, indeksy, indeksy2); mergesort(tab, s+1, q, tab2, indeksy, indeksy2); int first = p; int second = s+1; for(int i=p; i<=q; i++) { if(second>q || (first<=s && tab[first]>tab[second])) { indeksy2[i] = indeksy[first]; tab2[i] = tab[first]; first++; } else { indeksy2[i] = indeksy[second]; tab2[i] = tab[second]; second++; } } for(int i=p; i<=q; i++) { tab[i] = tab2[i]; indeksy[i] = indeksy2[i]; } } } bool czy_jest_poprawny(int *ciag, int dlugosc, int liczba_przedzialow, int wywolanie, int *maksimum, bool *przedzial, int *posortowane_indeksy) { if(liczba_przedzialow==1) return false; if(maksimum[wywolanie]>ciag[dlugosc-1] || maksimum[wywolanie]==maksimum[wywolanie+1]) { if(liczba_przedzialow>=3) { if(maksimum[wywolanie]==maksimum[wywolanie+1]) wywolanie++; if(posortowane_indeksy[wywolanie]>0) przedzial[posortowane_indeksy[wywolanie]] = true; przedzial[posortowane_indeksy[wywolanie]+1] = true; return true; } int minimum = ciag[0]; int przesuniecie = 0; for(int i=0; i<dlugosc-1; i++) { if(ciag[i]<minimum) minimum=ciag[i]; if(posortowane_indeksy[wywolanie+przesuniecie]==i) while(posortowane_indeksy[wywolanie+przesuniecie]<=i) przesuniecie++; if(minimum>=maksimum[wywolanie+przesuniecie]) { przedzial[i+1] = true; return true; } } return false; } return czy_jest_poprawny(ciag, dlugosc-1, liczba_przedzialow-1, wywolanie+1, maksimum, przedzial, posortowane_indeksy); } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int dlugosc_ciagu; int liczba_przedzialow; cin>>dlugosc_ciagu>>liczba_przedzialow; int *ciag = new int [dlugosc_ciagu]; int *maksimum = new int [dlugosc_ciagu]; int *posortowane_indeksy = new int [dlugosc_ciagu]; int *temp = new int [dlugosc_ciagu]; int *temp2 = new int [dlugosc_ciagu]; bool *przedzial = new bool [dlugosc_ciagu]; for(int i=0; i<dlugosc_ciagu; i++) { cin>>ciag[i]; posortowane_indeksy[i] = i; przedzial[i] = false; maksimum[i] = ciag[i]; } mergesort(maksimum, 0, dlugosc_ciagu-1, temp, posortowane_indeksy, temp2); if(!czy_jest_poprawny(ciag, dlugosc_ciagu, liczba_przedzialow, 0, maksimum, przedzial, posortowane_indeksy)) cout<<"NIE"; else { cout<<"TAK"<<'\n'; int zaznaczono_przedzialow=0; for(int i=0; i<dlugosc_ciagu; i++) if(przedzial[i]) zaznaczono_przedzialow++; int przedzialy_do_zaznaczenia = liczba_przedzialow-zaznaczono_przedzialow-1; int index=1; while(przedzialy_do_zaznaczenia>0) { while(przedzial[index]) index++; przedzial[index] = true; przedzialy_do_zaznaczenia--; } for(int i=0; i<dlugosc_ciagu; i++) if(przedzial[i]) cout<<i<<" "; } return 0; }
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 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include <iostream> using namespace std; void mergesort(int *tab, int p, int q, int *tab2, int *indeksy, int *indeksy2) { if(p<q) { int s=(p+q)/2; mergesort(tab, p, s, tab2, indeksy, indeksy2); mergesort(tab, s+1, q, tab2, indeksy, indeksy2); int first = p; int second = s+1; for(int i=p; i<=q; i++) { if(second>q || (first<=s && tab[first]>tab[second])) { indeksy2[i] = indeksy[first]; tab2[i] = tab[first]; first++; } else { indeksy2[i] = indeksy[second]; tab2[i] = tab[second]; second++; } } for(int i=p; i<=q; i++) { tab[i] = tab2[i]; indeksy[i] = indeksy2[i]; } } } bool czy_jest_poprawny(int *ciag, int dlugosc, int liczba_przedzialow, int wywolanie, int *maksimum, bool *przedzial, int *posortowane_indeksy) { if(liczba_przedzialow==1) return false; if(maksimum[wywolanie]>ciag[dlugosc-1] || maksimum[wywolanie]==maksimum[wywolanie+1]) { if(liczba_przedzialow>=3) { if(maksimum[wywolanie]==maksimum[wywolanie+1]) wywolanie++; if(posortowane_indeksy[wywolanie]>0) przedzial[posortowane_indeksy[wywolanie]] = true; przedzial[posortowane_indeksy[wywolanie]+1] = true; return true; } int minimum = ciag[0]; int przesuniecie = 0; for(int i=0; i<dlugosc-1; i++) { if(ciag[i]<minimum) minimum=ciag[i]; if(posortowane_indeksy[wywolanie+przesuniecie]==i) while(posortowane_indeksy[wywolanie+przesuniecie]<=i) przesuniecie++; if(minimum>=maksimum[wywolanie+przesuniecie]) { przedzial[i+1] = true; return true; } } return false; } return czy_jest_poprawny(ciag, dlugosc-1, liczba_przedzialow-1, wywolanie+1, maksimum, przedzial, posortowane_indeksy); } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int dlugosc_ciagu; int liczba_przedzialow; cin>>dlugosc_ciagu>>liczba_przedzialow; int *ciag = new int [dlugosc_ciagu]; int *maksimum = new int [dlugosc_ciagu]; int *posortowane_indeksy = new int [dlugosc_ciagu]; int *temp = new int [dlugosc_ciagu]; int *temp2 = new int [dlugosc_ciagu]; bool *przedzial = new bool [dlugosc_ciagu]; for(int i=0; i<dlugosc_ciagu; i++) { cin>>ciag[i]; posortowane_indeksy[i] = i; przedzial[i] = false; maksimum[i] = ciag[i]; } mergesort(maksimum, 0, dlugosc_ciagu-1, temp, posortowane_indeksy, temp2); if(!czy_jest_poprawny(ciag, dlugosc_ciagu, liczba_przedzialow, 0, maksimum, przedzial, posortowane_indeksy)) cout<<"NIE"; else { cout<<"TAK"<<'\n'; int zaznaczono_przedzialow=0; for(int i=0; i<dlugosc_ciagu; i++) if(przedzial[i]) zaznaczono_przedzialow++; int przedzialy_do_zaznaczenia = liczba_przedzialow-zaznaczono_przedzialow-1; int index=1; while(przedzialy_do_zaznaczenia>0) { while(przedzial[index]) index++; przedzial[index] = true; przedzialy_do_zaznaczenia--; } for(int i=0; i<dlugosc_ciagu; i++) if(przedzial[i]) cout<<i<<" "; } return 0; } |