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