#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; } |