#include <bits/stdc++.h>
using namespace std;
using ll = int64_t;
void solve() {
int n;
cin >> n;
vector<int> vs(n);
for(auto& v : vs) {
cin >> v;
}
int mi = max_element(vs.begin(), vs.end()) - vs.begin();
vector<int> stack;
stack.push_back(vs[mi]);
int i = (n + mi - 1) % n;
int ans = 0;
while(i != mi) {
while(!stack.empty() && stack.back() <= vs[i]) {
stack.pop_back();
}
stack.push_back(vs[i]);
ans = max<int>(ans, stack.size());
i--;
if(i < 0) {
i += n;
}
}
cout << ans;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//freopen("kam1.in", "r", stdin);
solve();
}
// idea:
/*
DSU na kolor
DSU na usuniete
Robimy usun wierzcholek (czy cos takiego)
- najpierw patrzy na wszystkich sasiadow, ktorzy sa usunieci mergujemy ich w jednego usunietego
- dla kazdego sasiada patrzymy czy jest juz w zbiorze naszego zmergowanego jezeli nie to union i zmniejszami liczbe componentow
- jak robimy mergowanie:
- - mamy kilka usunietych (znamy ich id w uf) np 1, 2, 3, 10
- - robimy na nich union
- - mamy tez vector<set<int>> - zbior sasiadow dla usunietego
- - do najwiekszego setu dodajemy reszte
- - std::swap i cleary
- - no i teoria jest taka, wartosci w setach mamy sumarycznie tyle co krawedzi wiec to powinny byc mlogm czy cos, ale moze to nie prawda
*/
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 | #include <bits/stdc++.h> using namespace std; using ll = int64_t; void solve() { int n; cin >> n; vector<int> vs(n); for(auto& v : vs) { cin >> v; } int mi = max_element(vs.begin(), vs.end()) - vs.begin(); vector<int> stack; stack.push_back(vs[mi]); int i = (n + mi - 1) % n; int ans = 0; while(i != mi) { while(!stack.empty() && stack.back() <= vs[i]) { stack.pop_back(); } stack.push_back(vs[i]); ans = max<int>(ans, stack.size()); i--; if(i < 0) { i += n; } } cout << ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("kam1.in", "r", stdin); solve(); } // idea: /* DSU na kolor DSU na usuniete Robimy usun wierzcholek (czy cos takiego) - najpierw patrzy na wszystkich sasiadow, ktorzy sa usunieci mergujemy ich w jednego usunietego - dla kazdego sasiada patrzymy czy jest juz w zbiorze naszego zmergowanego jezeli nie to union i zmniejszami liczbe componentow - jak robimy mergowanie: - - mamy kilka usunietych (znamy ich id w uf) np 1, 2, 3, 10 - - robimy na nich union - - mamy tez vector<set<int>> - zbior sasiadow dla usunietego - - do najwiekszego setu dodajemy reszte - - std::swap i cleary - - no i teoria jest taka, wartosci w setach mamy sumarycznie tyle co krawedzi wiec to powinny byc mlogm czy cos, ale moze to nie prawda */ |
English