// Zadanie Naszyjnik
// Potyczki algorytmiczne 2026
#include <iostream>
#include <string>
using namespace std;
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
unsigned int n, dlght_cnt, max_dlght_cnt,
gtst, igtst; // Największa w danym obrocie i jej indeks.
cin >> n;
int *a = new int[n];
bool *is_gtr = new bool[n]; // true wtt a należy do większych
// Pobranie a i ustalenie wartości początkowych.
cin >> a[0];
is_gtr[0] = true; // Brak poprzednich.
dlght_cnt = 1;
gtst = a[0]; igtst = 0;
for (int i = 1 ; i < n; i++)
{
cin >> a[i];
if (a[i] > gtst)
{
gtst = a[i]; igtst = i;
dlght_cnt++;
is_gtr[i] = true;
}
else
is_gtr[i] = false;
}
max_dlght_cnt = dlght_cnt;
for (unsigned int istart = 1; istart < n; istart++)
{
if (istart - 1 == igtst) // Przeniesiono największą
{
// Zbadać dwa obszary i wyznaczyć nową największą, zaktualizować is_gtr.
is_gtr[istart] = true; // Brak poprzednich.
dlght_cnt = 1;
gtst = a[istart]; igtst = istart;
for (int i = istart + 1 ; i < n; i++)
{
if (a[i] > gtst)
{
gtst = a[i]; igtst = i;
dlght_cnt++;
is_gtr[i] = true;
}
else
is_gtr[i] = false;
}
for (int i = 0; i < istart; i++)
{
if (a[i] > gtst)
{
gtst = a[i]; igtst = i;
dlght_cnt++;
is_gtr[i] = true;
}
else
is_gtr[i] = false;
}
}
else // Przeniesiono nienajwiększą
{
dlght_cnt--;
// Szukamy większych przed pierwszą z tych większych już znalezioną.
if (!is_gtr[istart])
dlght_cnt++;
is_gtr[istart] = true;
int b = a[istart]; // Do porównywania
// Zbadać zakres nieprzeniesionych.
for (int i = istart + 1; i < n; i++)
{
if (is_gtr[i])
break;
if (a[i] > b)
{
b = a[i];
dlght_cnt++;
is_gtr[i] = true;
}
else
is_gtr[i] = false;
}
// Jeżeli największa jest w nieprzeniesionych, to już wystarczy.
if (b == a[istart] && igtst < istart)
// Największa jest w przeniesionych
// i nie znalazł żadnej z tych większych.
{
// Zbadać zakres przeniesionych
for (int i = 0; i < istart; i++)
{
if (is_gtr[i])
break;
if (a[i] > b)
{
b = a[i];
dlght_cnt++;
is_gtr[i] = true;
}
else
is_gtr[i] = false;
}
}
}
if (dlght_cnt > max_dlght_cnt)
max_dlght_cnt = dlght_cnt;
}
delete [] is_gtr;
delete [] a;
cout << max_dlght_cnt << endl;
// system("pause");
}
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 | // Zadanie Naszyjnik // Potyczki algorytmiczne 2026 #include <iostream> #include <string> using namespace std; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); unsigned int n, dlght_cnt, max_dlght_cnt, gtst, igtst; // Największa w danym obrocie i jej indeks. cin >> n; int *a = new int[n]; bool *is_gtr = new bool[n]; // true wtt a należy do większych // Pobranie a i ustalenie wartości początkowych. cin >> a[0]; is_gtr[0] = true; // Brak poprzednich. dlght_cnt = 1; gtst = a[0]; igtst = 0; for (int i = 1 ; i < n; i++) { cin >> a[i]; if (a[i] > gtst) { gtst = a[i]; igtst = i; dlght_cnt++; is_gtr[i] = true; } else is_gtr[i] = false; } max_dlght_cnt = dlght_cnt; for (unsigned int istart = 1; istart < n; istart++) { if (istart - 1 == igtst) // Przeniesiono największą { // Zbadać dwa obszary i wyznaczyć nową największą, zaktualizować is_gtr. is_gtr[istart] = true; // Brak poprzednich. dlght_cnt = 1; gtst = a[istart]; igtst = istart; for (int i = istart + 1 ; i < n; i++) { if (a[i] > gtst) { gtst = a[i]; igtst = i; dlght_cnt++; is_gtr[i] = true; } else is_gtr[i] = false; } for (int i = 0; i < istart; i++) { if (a[i] > gtst) { gtst = a[i]; igtst = i; dlght_cnt++; is_gtr[i] = true; } else is_gtr[i] = false; } } else // Przeniesiono nienajwiększą { dlght_cnt--; // Szukamy większych przed pierwszą z tych większych już znalezioną. if (!is_gtr[istart]) dlght_cnt++; is_gtr[istart] = true; int b = a[istart]; // Do porównywania // Zbadać zakres nieprzeniesionych. for (int i = istart + 1; i < n; i++) { if (is_gtr[i]) break; if (a[i] > b) { b = a[i]; dlght_cnt++; is_gtr[i] = true; } else is_gtr[i] = false; } // Jeżeli największa jest w nieprzeniesionych, to już wystarczy. if (b == a[istart] && igtst < istart) // Największa jest w przeniesionych // i nie znalazł żadnej z tych większych. { // Zbadać zakres przeniesionych for (int i = 0; i < istart; i++) { if (is_gtr[i]) break; if (a[i] > b) { b = a[i]; dlght_cnt++; is_gtr[i] = true; } else is_gtr[i] = false; } } } if (dlght_cnt > max_dlght_cnt) max_dlght_cnt = dlght_cnt; } delete [] is_gtr; delete [] a; cout << max_dlght_cnt << endl; // system("pause"); } |
English