#include <bits/stdc++.h>
using namespace std;
long long a[1000006],b[1000006];
long long n,pr,le,it,g,po,pom;
long long maks,ilosc,mi,ma,o;
stack<pair<int,int> >s;
bool opusc[1000006];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[a[i]] = i;
opusc[i] = false;
}
maks = 2 * n + 1;
ma = 0;
mi = n + 1;
ilosc = 0;
o = 1;
for(int i=n;i>=1;i--)
{
if(ma >= 1)
{
for(int j=ma + 1;j<b[i];j++)
opusc[a[j]] = true;
}
if(mi <= n)
{
for(int j=mi - 1;j>b[i];j--)
opusc[a[j]] = true;
}
ma = max(ma,b[i]);
mi = min(mi,b[i]);
if(opusc[i - 1] || ma - mi > 2 * (n - i))
{
continue;
}
if(i > 1)
it = b[i - 1];
pr = 2 * (n - i) + mi;
le = ma - 2 * (n - i);
pr = min(pr,n);
le = max(le,o);
//cout<<it<<endl;
if(it < mi || ma < it)
{
if(it > ma)
pr = min(pr,it - 1);
else if(it < mi)
le = max(le,it + 1);
}
pr = pr - ma;
le = mi - le;
g = 2 * (n - i) - ma + mi;
if(g - le >= pr)
pom = (le + 1) * (pr + 1);
else
{
po = g - pr + 1;
pom = (po) * (pr + 1);
pom += (le - po + 1) * (2 * g - le - po + 2) / 2;
}
//cout<<i<<" "<<pom<<" "<<le<<" "<<pr<<" "<<g<<"\n";
ilosc += pom;
}
cout<<maks<<" "<<ilosc<<"\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 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <bits/stdc++.h> using namespace std; long long a[1000006],b[1000006]; long long n,pr,le,it,g,po,pom; long long maks,ilosc,mi,ma,o; stack<pair<int,int> >s; bool opusc[1000006]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; b[a[i]] = i; opusc[i] = false; } maks = 2 * n + 1; ma = 0; mi = n + 1; ilosc = 0; o = 1; for(int i=n;i>=1;i--) { if(ma >= 1) { for(int j=ma + 1;j<b[i];j++) opusc[a[j]] = true; } if(mi <= n) { for(int j=mi - 1;j>b[i];j--) opusc[a[j]] = true; } ma = max(ma,b[i]); mi = min(mi,b[i]); if(opusc[i - 1] || ma - mi > 2 * (n - i)) { continue; } if(i > 1) it = b[i - 1]; pr = 2 * (n - i) + mi; le = ma - 2 * (n - i); pr = min(pr,n); le = max(le,o); //cout<<it<<endl; if(it < mi || ma < it) { if(it > ma) pr = min(pr,it - 1); else if(it < mi) le = max(le,it + 1); } pr = pr - ma; le = mi - le; g = 2 * (n - i) - ma + mi; if(g - le >= pr) pom = (le + 1) * (pr + 1); else { po = g - pr + 1; pom = (po) * (pr + 1); pom += (le - po + 1) * (2 * g - le - po + 2) / 2; } //cout<<i<<" "<<pom<<" "<<le<<" "<<pr<<" "<<g<<"\n"; ilosc += pom; } cout<<maks<<" "<<ilosc<<"\n"; return 0; } |
English