#include <bits/stdc++.h> int n; long long sposoby; int miejsce[1000003]; int tab[1000003]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &tab[i]); miejsce[tab[i]] = i; } if (n == 1) { printf("3 1\n"); return 0; } /* liczenie nieparzystych median */ int pocz = miejsce[n]; int kon = miejsce[n]; sposoby++; /* printf("NIEPARZYSTE\n"); */ for (int i = n - 1; i >= ((n + 1)/2); i--) { pocz = std::min(pocz, miejsce[i]); kon = std::max(kon, miejsce[i]); int ileWiekszych = n - i; int rozneOdMediany = kon - pocz; int ileMniejszych = rozneOdMediany - ileWiekszych; /* printf("ILEMNIEJSZYCH = %d ILEWIEKSZYCH = %d\n", ileMniejszych, ileWiekszych); */ if (ileMniejszych > ileWiekszych) continue; if (ileMniejszych == ileWiekszych) { sposoby++; /* printf("ROWNE + 1 [%d]\n", i); */ continue; } int poLewej = pocz - 1; int poPrawej = n - kon; int ileDolozyc = ileWiekszych - ileMniejszych; if (ileDolozyc + ileWiekszych + ileMniejszych + 1 > n) continue; if (poLewej >= ileDolozyc && poPrawej >= ileDolozyc) { /* printf("WIECEJ [%d][%d]\n", i, ileDolozyc + 1); */ sposoby += ileDolozyc + 1; continue; } if (poLewej >= ileDolozyc || poPrawej >= ileDolozyc) { /* printf("JEDNA WIECEJ [%d][%d]\n", i, std::min(poLewej, poPrawej) + 1); */ sposoby += std::min(poLewej, poPrawej) + 1; continue; } /* printf("ILEDOLOZYC = %d\n", ileDolozyc); */ /* printf("KROTKI [%d][%d]\n", i, poLewej + poPrawej + 1 - ileDolozyc); */ sposoby += poLewej + poPrawej + 1 - ileDolozyc; } /* liczenie parzystych median */ /* printf("PARZYSTE\n"); */ pocz = std::min(miejsce[n], miejsce[n - 1]); kon = std::max(miejsce[n], miejsce[n - 1]); for (int i = n; i > n/2; i--) { pocz = std::min(pocz, miejsce[i - 1]); kon = std::max(kon, miejsce[i - 1]); int ileWiekszych = n - i; int ileMniejszych = kon - pocz - ileWiekszych - 1; /* printf("ILEMNIEJSZYCH [%d] ILEWIEKSZYCH [%d]\n", ileMniejszych, ileWiekszych); */ if (ileMniejszych > ileWiekszych) continue; if (ileMniejszych == ileWiekszych) { sposoby++; continue; } int poLewej = pocz - 1; int poPrawej = n - kon; int ileDolozyc = ileWiekszych - ileMniejszych; if (ileDolozyc + ileWiekszych + ileMniejszych + 2 > n) continue; if (poLewej >= ileDolozyc && poPrawej >= ileDolozyc) { /* printf("WIECEJ [%d][%d]\n", i, ileDolozyc + 1); */ sposoby += ileDolozyc + 1; continue; } if (poLewej >= ileDolozyc || poPrawej >= ileDolozyc) { /* printf("JEDNA WIECEJ [%d][%d]\n", i, std::min(poLewej, poPrawej) + 1); */ sposoby += std::min(poLewej, poPrawej) + 1; continue; } /* printf("KROTKI [%d][%d]\n", i, poLewej + poPrawej + 1 - ileDolozyc); */ sposoby += poLewej + poPrawej + 1 - ileDolozyc; } printf("%d %lld\n", n * 2 + 1, sposoby); }
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 | #include <bits/stdc++.h> int n; long long sposoby; int miejsce[1000003]; int tab[1000003]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &tab[i]); miejsce[tab[i]] = i; } if (n == 1) { printf("3 1\n"); return 0; } /* liczenie nieparzystych median */ int pocz = miejsce[n]; int kon = miejsce[n]; sposoby++; /* printf("NIEPARZYSTE\n"); */ for (int i = n - 1; i >= ((n + 1)/2); i--) { pocz = std::min(pocz, miejsce[i]); kon = std::max(kon, miejsce[i]); int ileWiekszych = n - i; int rozneOdMediany = kon - pocz; int ileMniejszych = rozneOdMediany - ileWiekszych; /* printf("ILEMNIEJSZYCH = %d ILEWIEKSZYCH = %d\n", ileMniejszych, ileWiekszych); */ if (ileMniejszych > ileWiekszych) continue; if (ileMniejszych == ileWiekszych) { sposoby++; /* printf("ROWNE + 1 [%d]\n", i); */ continue; } int poLewej = pocz - 1; int poPrawej = n - kon; int ileDolozyc = ileWiekszych - ileMniejszych; if (ileDolozyc + ileWiekszych + ileMniejszych + 1 > n) continue; if (poLewej >= ileDolozyc && poPrawej >= ileDolozyc) { /* printf("WIECEJ [%d][%d]\n", i, ileDolozyc + 1); */ sposoby += ileDolozyc + 1; continue; } if (poLewej >= ileDolozyc || poPrawej >= ileDolozyc) { /* printf("JEDNA WIECEJ [%d][%d]\n", i, std::min(poLewej, poPrawej) + 1); */ sposoby += std::min(poLewej, poPrawej) + 1; continue; } /* printf("ILEDOLOZYC = %d\n", ileDolozyc); */ /* printf("KROTKI [%d][%d]\n", i, poLewej + poPrawej + 1 - ileDolozyc); */ sposoby += poLewej + poPrawej + 1 - ileDolozyc; } /* liczenie parzystych median */ /* printf("PARZYSTE\n"); */ pocz = std::min(miejsce[n], miejsce[n - 1]); kon = std::max(miejsce[n], miejsce[n - 1]); for (int i = n; i > n/2; i--) { pocz = std::min(pocz, miejsce[i - 1]); kon = std::max(kon, miejsce[i - 1]); int ileWiekszych = n - i; int ileMniejszych = kon - pocz - ileWiekszych - 1; /* printf("ILEMNIEJSZYCH [%d] ILEWIEKSZYCH [%d]\n", ileMniejszych, ileWiekszych); */ if (ileMniejszych > ileWiekszych) continue; if (ileMniejszych == ileWiekszych) { sposoby++; continue; } int poLewej = pocz - 1; int poPrawej = n - kon; int ileDolozyc = ileWiekszych - ileMniejszych; if (ileDolozyc + ileWiekszych + ileMniejszych + 2 > n) continue; if (poLewej >= ileDolozyc && poPrawej >= ileDolozyc) { /* printf("WIECEJ [%d][%d]\n", i, ileDolozyc + 1); */ sposoby += ileDolozyc + 1; continue; } if (poLewej >= ileDolozyc || poPrawej >= ileDolozyc) { /* printf("JEDNA WIECEJ [%d][%d]\n", i, std::min(poLewej, poPrawej) + 1); */ sposoby += std::min(poLewej, poPrawej) + 1; continue; } /* printf("KROTKI [%d][%d]\n", i, poLewej + poPrawej + 1 - ileDolozyc); */ sposoby += poLewej + poPrawej + 1 - ileDolozyc; } printf("%d %lld\n", n * 2 + 1, sposoby); } |