#include<bits/stdc++.h> using namespace std; int tab[1000010]; map <int,int> mapa; vector <int> tablica; void op2(int a) { int poz=1,pozv=0; int mini=2*pow(10,9); int maxi=0; for(int i=1;i<=a;i++) { mapa[tab[i]]++; tablica.push_back(-tab[i]); maxi=max(maxi,tab[i]); } sort(tablica.begin(),tablica.end()); mini=-tablica[0]; while(maxi>=mini) { mapa[tab[poz]]--; if(mapa[tab[poz]]==0 && tab[poz]==maxi) { pozv++; maxi=-tablica[pozv]; mini=min(mini,tab[poz]); } poz++; if(poz==a) { cout << "NIE"; return ; } } cout << "TAK\n" << poz << " " << mini << " " << maxi; } /// wszystko jest w ciągu 2, a wypisujemy pozycję wtedy, gdy największy element ciągu starego jest mniejszy od najmniejszego elementu ciągu nowego. int main() { int a,b,mxp=0,mx=0,c=0; cin >> a >> b; for(int i=1;i<=a;i++) { cin >> tab[i]; if(tab[i]>mx) { mx=tab[i]; mxp=i; } } if(b==2) { /// pomysł na 2 przedziały: najpierw ustawiam wskaźnik na 0, i zapisuję jakie są liczby w przedziale po wskaźniku razem z ich ilością. Potem przechodzę wskaźnikiem i usuwam element /// z przedziału 2 i dodaję na przedział 1. Następnie patrzę na elementy czy przedział 2 jest wiekszy od przedziału 1 (najw. el. p. 2 < najmn. el. p. 1) i wtedy wypisuję op2(a); return 0; } if(mxp==a || mxp==1) { if(mxp==1) { cout << "TAK\n"; for (int i=1;i<b;i++) { cout << i << " "; } return 0; } else { for(int i=a;i>0;i--) { if(tab[i]<=tab[i-1]) { c=i; break; } } if(c==0) { cout << "NIE"; return 0; } } if(b==3) { cout << "TAK\n"; cout << c-1 << " " << c; } if(b>=4) { if(c<=b) { cout << "TAK\n"; for (int i=1;i<b;i++) { cout << i << " "; } } else { cout << "TAK\n"; for(int i=1;i<=b-2;i++) { cout << i << " "; } cout << c-1 << " " << c; } } } else /// jak mxp=1 to jest na drugiej pozycji i jak chcemy wypisać ten element i ten przed nim to wypisujemy mxp i mxp+1 { if(b==3) { cout << "TAK\n" << mxp << " " << mxp+1; } if(b>=4) /// 1 2 3 4 1 2 3 3 //5 nie można, //b>=6 można, mxp=4, if(mxp+2<=b) { if(mxp+2<=b) { cout << "TAK\n"; for (int i=1;i<b;i++) { cout << i << " "; } } else { cout << "TAK\n"; for(int i=1;i<b-2;i++) { cout << i << " "; } cout << mxp << " " << mxp+1; } } } }
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 128 129 130 131 132 133 134 135 136 137 138 | #include<bits/stdc++.h> using namespace std; int tab[1000010]; map <int,int> mapa; vector <int> tablica; void op2(int a) { int poz=1,pozv=0; int mini=2*pow(10,9); int maxi=0; for(int i=1;i<=a;i++) { mapa[tab[i]]++; tablica.push_back(-tab[i]); maxi=max(maxi,tab[i]); } sort(tablica.begin(),tablica.end()); mini=-tablica[0]; while(maxi>=mini) { mapa[tab[poz]]--; if(mapa[tab[poz]]==0 && tab[poz]==maxi) { pozv++; maxi=-tablica[pozv]; mini=min(mini,tab[poz]); } poz++; if(poz==a) { cout << "NIE"; return ; } } cout << "TAK\n" << poz << " " << mini << " " << maxi; } /// wszystko jest w ciągu 2, a wypisujemy pozycję wtedy, gdy największy element ciągu starego jest mniejszy od najmniejszego elementu ciągu nowego. int main() { int a,b,mxp=0,mx=0,c=0; cin >> a >> b; for(int i=1;i<=a;i++) { cin >> tab[i]; if(tab[i]>mx) { mx=tab[i]; mxp=i; } } if(b==2) { /// pomysł na 2 przedziały: najpierw ustawiam wskaźnik na 0, i zapisuję jakie są liczby w przedziale po wskaźniku razem z ich ilością. Potem przechodzę wskaźnikiem i usuwam element /// z przedziału 2 i dodaję na przedział 1. Następnie patrzę na elementy czy przedział 2 jest wiekszy od przedziału 1 (najw. el. p. 2 < najmn. el. p. 1) i wtedy wypisuję op2(a); return 0; } if(mxp==a || mxp==1) { if(mxp==1) { cout << "TAK\n"; for (int i=1;i<b;i++) { cout << i << " "; } return 0; } else { for(int i=a;i>0;i--) { if(tab[i]<=tab[i-1]) { c=i; break; } } if(c==0) { cout << "NIE"; return 0; } } if(b==3) { cout << "TAK\n"; cout << c-1 << " " << c; } if(b>=4) { if(c<=b) { cout << "TAK\n"; for (int i=1;i<b;i++) { cout << i << " "; } } else { cout << "TAK\n"; for(int i=1;i<=b-2;i++) { cout << i << " "; } cout << c-1 << " " << c; } } } else /// jak mxp=1 to jest na drugiej pozycji i jak chcemy wypisać ten element i ten przed nim to wypisujemy mxp i mxp+1 { if(b==3) { cout << "TAK\n" << mxp << " " << mxp+1; } if(b>=4) /// 1 2 3 4 1 2 3 3 //5 nie można, //b>=6 można, mxp=4, if(mxp+2<=b) { if(mxp+2<=b) { cout << "TAK\n"; for (int i=1;i<b;i++) { cout << i << " "; } } else { cout << "TAK\n"; for(int i=1;i<b-2;i++) { cout << i << " "; } cout << mxp << " " << mxp+1; } } } } |