#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define st first #define nd second #define pb push_back #define rep(i,a,b) for(ll i=a;i<=b;i++) #define all(a) a.begin(),a.end() const ll mxN = 1e6+7; ll a[mxN]; pair<ll,ll> prze[mxN]; ll gdzie[mxN]; ll policz(ll x,ll y,ll k){ if(k == 0) return 1; if(k > (x+y)) return 0; if(x > y) swap(x,y); return min(y,k)-k+min(k,x)+1; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll n; cin >> n; rep(i,1,n) cin >> a[i]; rep(i,1,n) gdzie[a[i]] = i; prze[1] = {gdzie[n],gdzie[n]}; rep(i,2,n){ int k = n-i+1; if(prze[i-1].st <= gdzie[k] && gdzie[k] <= prze[i-1].nd) prze[i] = prze[i-1]; else if(gdzie[k] < prze[i-1].st) prze[i] = {gdzie[k],prze[i-1].nd}; else prze[i] = {prze[i-1].st,gdzie[k]}; } ll res = 0; for(ll i=1;n>=2*i-2;i++){ ll dl = prze[i].nd-prze[i].st+1; if(dl <= (2*i-2)){ res += policz(prze[i].st-1,n-prze[i].nd,2*i-2-dl); //cout << prze[i].st-1 << " " << n-prze[i].nd << " " << (2*i-2-dl) << " " << policz(prze[i].st-1,n-prze[i].nd,2*i-2-dl) <<"\n"; } if(dl <= (2*i-1)){ res += policz(prze[i].st-1,n-prze[i].nd,2*i-1-dl); //cout << prze[i].st-1 << " " << n-prze[i].nd << " " << 2*i-1-dl << " " << policz(prze[i].st-1,n-prze[i].nd,2*i-1-dl) << "\n"; } } cout << (2*n+1) << " " << res << "\n"; }
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define st first #define nd second #define pb push_back #define rep(i,a,b) for(ll i=a;i<=b;i++) #define all(a) a.begin(),a.end() const ll mxN = 1e6+7; ll a[mxN]; pair<ll,ll> prze[mxN]; ll gdzie[mxN]; ll policz(ll x,ll y,ll k){ if(k == 0) return 1; if(k > (x+y)) return 0; if(x > y) swap(x,y); return min(y,k)-k+min(k,x)+1; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); ll n; cin >> n; rep(i,1,n) cin >> a[i]; rep(i,1,n) gdzie[a[i]] = i; prze[1] = {gdzie[n],gdzie[n]}; rep(i,2,n){ int k = n-i+1; if(prze[i-1].st <= gdzie[k] && gdzie[k] <= prze[i-1].nd) prze[i] = prze[i-1]; else if(gdzie[k] < prze[i-1].st) prze[i] = {gdzie[k],prze[i-1].nd}; else prze[i] = {prze[i-1].st,gdzie[k]}; } ll res = 0; for(ll i=1;n>=2*i-2;i++){ ll dl = prze[i].nd-prze[i].st+1; if(dl <= (2*i-2)){ res += policz(prze[i].st-1,n-prze[i].nd,2*i-2-dl); //cout << prze[i].st-1 << " " << n-prze[i].nd << " " << (2*i-2-dl) << " " << policz(prze[i].st-1,n-prze[i].nd,2*i-2-dl) <<"\n"; } if(dl <= (2*i-1)){ res += policz(prze[i].st-1,n-prze[i].nd,2*i-1-dl); //cout << prze[i].st-1 << " " << n-prze[i].nd << " " << 2*i-1-dl << " " << policz(prze[i].st-1,n-prze[i].nd,2*i-1-dl) << "\n"; } } cout << (2*n+1) << " " << res << "\n"; } |