#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
#define INF 1000005
int n;
int tab[INF];
int refi[INF];
int main()
{
scanf("%d", &n);
for(int i=0;i<n;i++){
scanf("%d", tab+i);
refi[tab[i]]=i;
}
long long res=1;
long long szuk=0,left,right;
left=refi[n];
right=refi[n];
long long l_tmp,r_tmp;
l_tmp=refi[n];
r_tmp=refi[n];
for(int k=2;k<=n;k++) {
//printf("Dla długości: %d\n",k);
//printf("Mediana: %d\n", 2*n+1-k);
szuk = n-k/2;
//printf("poszukiwany: %d\n",szuk);
if(left>refi[szuk]) {
left=refi[szuk];
}
if(right<refi[szuk]) {
right=refi[szuk];
}
//printf("left: %d, right: %d\n",left,right);
if(right-left+1>k) {
//printf("za mały +0\n");
continue;
}
if(right-left+1==k) {
//printf("tylko aktualny +1\n");
res++;
continue;
}
l_tmp=right-k+1;
if(l_tmp<0) l_tmp=0;
r_tmp=k+left-1;
if(r_tmp>n-1) r_tmp=n-1;
//while(l_tmp>0 && right-l_tmp+2<=k) l_tmp--;
//while(r_tmp<n-1 && r_tmp+1-left+1<=k) r_tmp++;
//printf("dodajemy z oby: %d\n", r_tmp-l_tmp+1-k+1);
//printf("tmp_left: %d, tmp_right: %d\n",l_tmp,r_tmp);
res+=r_tmp-l_tmp+1-k+1;
}
//printf("Wynik:%d\n",res);
printf("%d %lld\n", 2*n+1, res);
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 | #include<cstdio> #include<algorithm> #include<vector> using namespace std; #define INF 1000005 int n; int tab[INF]; int refi[INF]; int main() { scanf("%d", &n); for(int i=0;i<n;i++){ scanf("%d", tab+i); refi[tab[i]]=i; } long long res=1; long long szuk=0,left,right; left=refi[n]; right=refi[n]; long long l_tmp,r_tmp; l_tmp=refi[n]; r_tmp=refi[n]; for(int k=2;k<=n;k++) { //printf("Dla długości: %d\n",k); //printf("Mediana: %d\n", 2*n+1-k); szuk = n-k/2; //printf("poszukiwany: %d\n",szuk); if(left>refi[szuk]) { left=refi[szuk]; } if(right<refi[szuk]) { right=refi[szuk]; } //printf("left: %d, right: %d\n",left,right); if(right-left+1>k) { //printf("za mały +0\n"); continue; } if(right-left+1==k) { //printf("tylko aktualny +1\n"); res++; continue; } l_tmp=right-k+1; if(l_tmp<0) l_tmp=0; r_tmp=k+left-1; if(r_tmp>n-1) r_tmp=n-1; //while(l_tmp>0 && right-l_tmp+2<=k) l_tmp--; //while(r_tmp<n-1 && r_tmp+1-left+1<=k) r_tmp++; //printf("dodajemy z oby: %d\n", r_tmp-l_tmp+1-k+1); //printf("tmp_left: %d, tmp_right: %d\n",l_tmp,r_tmp); res+=r_tmp-l_tmp+1-k+1; } //printf("Wynik:%d\n",res); printf("%d %lld\n", 2*n+1, res); return 0; } |
English