#include<bits/stdc++.h>
using namespace std;
int maks[1000010]; //maks[i] -> maksymalny index ze wszystkich indexów elementów większych od i
int mini[1000010]; //mini[i] -> minimialny index ze wszystkich indexów elementów większych od i
bool odw_maks[1000010];
bool odw_mini[1000010];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
vector<int> v;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
v.push_back(a);
}
for(int i=v.size()-1;i>=0;i--)
{
int a=v[i];
for(int j=a;j>=0;j--)
{
if(odw_maks[j]==true)
break;
odw_maks[j]=true;
maks[j]=i;
}
}
for(int i=0;i<v.size();i++)
{
int a=v[i];
for(int j=a;j>=0;j--)
{
if(odw_mini[j]==true)
break;
odw_mini[j]=true;
mini[j]=i;
}
}
int res=0;
int val=2*n+1;
for(int i=n/2;i<=n;i++)
{
// cout<<"\n";
int range=maks[i]-mini[i]+1;
// cout<<" i:"<<i<<" maks[i]: "<<maks[i]<<" mini[i]:"<<mini[i]<<" range:"<<range<<" ";
if(i>n/2)
{
if(range<=2*n-2*i+1)
{
int m=0;
if(range==2*n-2*i+1) m=1;
else
{
if(mini[i]>v.size()-1-maks[i])
{
int k=2*n-2*i+1-range-mini[i];
if(k<=0)
m=min(((int)v.size())-1-maks[i], (2*n-2*i+1-range));
else
m=v.size()-1-maks[i]-k;//ew. też dominować
}
else
{
int k=2*n-2*i+1-range-(v.size()-1-maks[i]);
// cout<<k<<" ";
if(k<=0)
m=min(mini[i], (2*n-2*i+1-range));
else
m=mini[i]-k;
}
// cout<<"m1: "<<m<<" ";
m++;
}
// cout<<m<<" ";
res+=m;
}
}
if(i==n) continue;
range=maks[i]-mini[i]+1;
if(range<=2*n-2*i)
{
int m=0;
if(range==2*n-2*i) m=1;
else
{
if(mini[i]>v.size()-1-maks[i])
{
int k=2*n-2*i-range-mini[i];
if(k<=0)
m=min(((int)v.size())-1-maks[i], (2*n-2*i-range));
else
m=v.size()-1-maks[i]-k;
}
else
{
int k=2*n-2*i-range-(v.size()-1-maks[i]);
if(k<=0)
m=min(mini[i], (2*n-2*i-range));
else
m=mini[i]-k;
}
// cout<<"m2: "<<m<<" ";
m++;
}
// cout<<m<<" ";
res+=m;
}
}
cout<<val<<" "<<res;
}
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 | #include<bits/stdc++.h> using namespace std; int maks[1000010]; //maks[i] -> maksymalny index ze wszystkich indexów elementów większych od i int mini[1000010]; //mini[i] -> minimialny index ze wszystkich indexów elementów większych od i bool odw_maks[1000010]; bool odw_mini[1000010]; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin>>n; vector<int> v; for(int i=0;i<n;i++) { int a; cin>>a; v.push_back(a); } for(int i=v.size()-1;i>=0;i--) { int a=v[i]; for(int j=a;j>=0;j--) { if(odw_maks[j]==true) break; odw_maks[j]=true; maks[j]=i; } } for(int i=0;i<v.size();i++) { int a=v[i]; for(int j=a;j>=0;j--) { if(odw_mini[j]==true) break; odw_mini[j]=true; mini[j]=i; } } int res=0; int val=2*n+1; for(int i=n/2;i<=n;i++) { // cout<<"\n"; int range=maks[i]-mini[i]+1; // cout<<" i:"<<i<<" maks[i]: "<<maks[i]<<" mini[i]:"<<mini[i]<<" range:"<<range<<" "; if(i>n/2) { if(range<=2*n-2*i+1) { int m=0; if(range==2*n-2*i+1) m=1; else { if(mini[i]>v.size()-1-maks[i]) { int k=2*n-2*i+1-range-mini[i]; if(k<=0) m=min(((int)v.size())-1-maks[i], (2*n-2*i+1-range)); else m=v.size()-1-maks[i]-k;//ew. też dominować } else { int k=2*n-2*i+1-range-(v.size()-1-maks[i]); // cout<<k<<" "; if(k<=0) m=min(mini[i], (2*n-2*i+1-range)); else m=mini[i]-k; } // cout<<"m1: "<<m<<" "; m++; } // cout<<m<<" "; res+=m; } } if(i==n) continue; range=maks[i]-mini[i]+1; if(range<=2*n-2*i) { int m=0; if(range==2*n-2*i) m=1; else { if(mini[i]>v.size()-1-maks[i]) { int k=2*n-2*i-range-mini[i]; if(k<=0) m=min(((int)v.size())-1-maks[i], (2*n-2*i-range)); else m=v.size()-1-maks[i]-k; } else { int k=2*n-2*i-range-(v.size()-1-maks[i]); if(k<=0) m=min(mini[i], (2*n-2*i-range)); else m=mini[i]-k; } // cout<<"m2: "<<m<<" "; m++; } // cout<<m<<" "; res+=m; } } cout<<val<<" "<<res; } |
English