#include <bits/stdc++.h>
using namespace std;
const int L=1<<20;
int d[2][L<<1];
void upd(int w, int c)
{
w+=L-1;
d[0][w]=d[1][w]=c;
w>>=1;
while (w)
{
d[0][w]=min(d[0][w], c);
d[1][w]=max(d[1][w], c);
w>>=1;
}
return;
}
int query(int p, int k, bool kt)
{
p+=L-1;
k+=L-1;
int r=(kt? INT_MIN : INT_MAX);
while (p <= k)
{
if (p&1)
{
if (kt) r=max(r, d[1][p]);
else r=min(r, d[0][p]);
}
if (!(k&1))
{
if (kt) r=max(r, d[1][k]);
else r=min(r, d[0][k]);
}
p=(p+1)>>1;
k=(k-1)>>1;
}
return r;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n; cin>>n;
memset(d[0], 0x3f, sizeof(d[0]));
for (int i=1; i<=n; i++)
{
int a; cin>>a;
upd(a, i);
}
long long odp=0;
for (int i=1; i<=n; i++)
{
int m=(2*n+1-i)/2;
int p=query(m, n, 0), k=query(m, n, 1);
// cout<<i<<" "<<m<<" "<<p<<" "<<k<<" ";
odp+=max(0, min(p, n-i+1)-max(1, (k-i+1))+1);
// cout<<odp<<"\n";
}
cout<<2*n+1<<" "<<odp;
return 0;
}
/*
5
1 4 3 5 2
*/
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 | #include <bits/stdc++.h> using namespace std; const int L=1<<20; int d[2][L<<1]; void upd(int w, int c) { w+=L-1; d[0][w]=d[1][w]=c; w>>=1; while (w) { d[0][w]=min(d[0][w], c); d[1][w]=max(d[1][w], c); w>>=1; } return; } int query(int p, int k, bool kt) { p+=L-1; k+=L-1; int r=(kt? INT_MIN : INT_MAX); while (p <= k) { if (p&1) { if (kt) r=max(r, d[1][p]); else r=min(r, d[0][p]); } if (!(k&1)) { if (kt) r=max(r, d[1][k]); else r=min(r, d[0][k]); } p=(p+1)>>1; k=(k-1)>>1; } return r; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin>>n; memset(d[0], 0x3f, sizeof(d[0])); for (int i=1; i<=n; i++) { int a; cin>>a; upd(a, i); } long long odp=0; for (int i=1; i<=n; i++) { int m=(2*n+1-i)/2; int p=query(m, n, 0), k=query(m, n, 1); // cout<<i<<" "<<m<<" "<<p<<" "<<k<<" "; odp+=max(0, min(p, n-i+1)-max(1, (k-i+1))+1); // cout<<odp<<"\n"; } cout<<2*n+1<<" "<<odp; return 0; } /* 5 1 4 3 5 2 */ |
English