#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
typedef long long int LL;
constexpr LL N = 1e6 + 7;
set <pair<LL,LL>> wieksze;
vector <pair<LL,LL>> poz;
LL tab[N], n, med, od, wyn=1,p,q,a,x, q1, p1;
inline LL podz() {
// med - 1 w przedziale
if(poz[x-1].second < p1 || poz[x-1].second > q1)
return -1;
return 2 + 2*(n - a) - (q1-p1+1);
}
inline LL n_podz() {
return 1 + 2*(n - a) - (q-p+1);
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie();
int uj = 0;
cin >> n;
cout<<2*n+1<<" ";
med = n/2 + 1;
if( n % 2 == 0 ) {
uj = 1;
wyn--;
} for(LL i=0;i!=n;i++)
cin>>tab[i];
for(LL i=0;i!=n;i++)
if(tab[i] >= med - uj) {
wieksze.insert({tab[i],i});
poz.push_back({tab[i],i});
}
sort(poz.begin(),poz.end());
for(LL i=1;i!=(LL)poz.size();i++) {
a = poz[i].first; x = poz[i].second; p = x; q = x; x = i;
while(!wieksze.empty() && wieksze.begin()->first <= a)
wieksze.erase(wieksze.begin());
while(!wieksze.empty()) {
auto it = wieksze.end(); it--;
if(it->first <= a)
wieksze.erase(it);
else break;
} if(!wieksze.empty()) {
auto it = wieksze.end(); it--;
p = min(p,wieksze.begin()->second);
q = max(q,it->second);
p1 = min(p,poz[x-1].second); q1 = max(q,poz[x-1].second);
LL s = podz();
if(s >= 0)
wyn += max((LL)1,2*min(min(n-q1-1,p1),s));
s = n_podz();
if(s >= 0)
wyn += max((LL)1,2*min(min(n-q-1,p),s));
}
} if(n != 1) wyn++;
if(abs(poz[poz.size()-2].second - poz.back().second) == 1) wyn++;
cout<<wyn<<"\n";
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 | #include <iostream> #include <algorithm> #include <vector> #include <set> using namespace std; typedef long long int LL; constexpr LL N = 1e6 + 7; set <pair<LL,LL>> wieksze; vector <pair<LL,LL>> poz; LL tab[N], n, med, od, wyn=1,p,q,a,x, q1, p1; inline LL podz() { // med - 1 w przedziale if(poz[x-1].second < p1 || poz[x-1].second > q1) return -1; return 2 + 2*(n - a) - (q1-p1+1); } inline LL n_podz() { return 1 + 2*(n - a) - (q-p+1); } int main() { ios_base::sync_with_stdio(0); cin.tie(); int uj = 0; cin >> n; cout<<2*n+1<<" "; med = n/2 + 1; if( n % 2 == 0 ) { uj = 1; wyn--; } for(LL i=0;i!=n;i++) cin>>tab[i]; for(LL i=0;i!=n;i++) if(tab[i] >= med - uj) { wieksze.insert({tab[i],i}); poz.push_back({tab[i],i}); } sort(poz.begin(),poz.end()); for(LL i=1;i!=(LL)poz.size();i++) { a = poz[i].first; x = poz[i].second; p = x; q = x; x = i; while(!wieksze.empty() && wieksze.begin()->first <= a) wieksze.erase(wieksze.begin()); while(!wieksze.empty()) { auto it = wieksze.end(); it--; if(it->first <= a) wieksze.erase(it); else break; } if(!wieksze.empty()) { auto it = wieksze.end(); it--; p = min(p,wieksze.begin()->second); q = max(q,it->second); p1 = min(p,poz[x-1].second); q1 = max(q,poz[x-1].second); LL s = podz(); if(s >= 0) wyn += max((LL)1,2*min(min(n-q1-1,p1),s)); s = n_podz(); if(s >= 0) wyn += max((LL)1,2*min(min(n-q-1,p),s)); } } if(n != 1) wyn++; if(abs(poz[poz.size()-2].second - poz.back().second) == 1) wyn++; cout<<wyn<<"\n"; return 0; } |
English