#include <iostream>
#include <vector>
#include <set>
using namespace std;
long long wynik = 0;
double n;
int pierw;
int ost;
void zliczanie(vector <int> a, double mediana){
int l = 0;
long long p = a.size()-1;
while (a[l] < mediana) {
l++;
}
while (a[p] < mediana) {
p--;
}
vector <int> b;
for (long i = l; i <= p; i++) {
b.push_back(a[i]);
}
p = a.size()-1-p;
mediana += (l+p)*0.5;
wynik += (l+1)*(p+1);
set <int> spr;
bool pow_1;
bool pow_2;
if (l == 0) {
if (b.size() >= 2) {
spr.insert(b[0]);
spr.insert(b[1]);
if (spr.count(n) && spr.count(n-1)) {
wynik++;
pow_1 = true;
}
for (int i = 2; i < b.size()-1; i++) {
spr.insert(b[i]);
pow_1 = true;
for (int j = n; j >= n-i; j--) {
if (spr.count(j) == false) {
pow_1 = false;
}
}
if (pow_1 == true) {
wynik++;
}
}
}
}else if(p == 0){
if (b.size() >= 2) {
spr.insert(b[b.size()-1]);
spr.insert(b[b.size()-2]);
if (spr.count(n) && spr.count(n-1)) {
wynik++;
pow_2 = true;
}
for (int i = 2; i < b.size()-1; i++) {
spr.insert(b[b.size()-1-i]);
pow_2 = true;
for (int j = n; j >= n-i; j--) {
if (spr.count(j) == false) {
pow_2 = false;
}
}
if (pow_2 == true) {
wynik++;
}
}
}
}
if (b[0] >= mediana && b[b.size()-1] >= mediana) {
if (b.size() > 1) {
wynik++;
}
return;
}else{
wynik--;
zliczanie(b, mediana);
}
}
int main() {
cin >> n;
vector <int> oceny(n);
for (int i = 0; i < n; i++) {
cin >> oceny[i];
}
pierw = oceny[0];
ost = oceny[n-1];
double med = (n+1)/2;
zliczanie(oceny, med);
cout << n*2+1 << " " << wynik << endl;
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 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 95 96 97 98 99 100 | #include <iostream> #include <vector> #include <set> using namespace std; long long wynik = 0; double n; int pierw; int ost; void zliczanie(vector <int> a, double mediana){ int l = 0; long long p = a.size()-1; while (a[l] < mediana) { l++; } while (a[p] < mediana) { p--; } vector <int> b; for (long i = l; i <= p; i++) { b.push_back(a[i]); } p = a.size()-1-p; mediana += (l+p)*0.5; wynik += (l+1)*(p+1); set <int> spr; bool pow_1; bool pow_2; if (l == 0) { if (b.size() >= 2) { spr.insert(b[0]); spr.insert(b[1]); if (spr.count(n) && spr.count(n-1)) { wynik++; pow_1 = true; } for (int i = 2; i < b.size()-1; i++) { spr.insert(b[i]); pow_1 = true; for (int j = n; j >= n-i; j--) { if (spr.count(j) == false) { pow_1 = false; } } if (pow_1 == true) { wynik++; } } } }else if(p == 0){ if (b.size() >= 2) { spr.insert(b[b.size()-1]); spr.insert(b[b.size()-2]); if (spr.count(n) && spr.count(n-1)) { wynik++; pow_2 = true; } for (int i = 2; i < b.size()-1; i++) { spr.insert(b[b.size()-1-i]); pow_2 = true; for (int j = n; j >= n-i; j--) { if (spr.count(j) == false) { pow_2 = false; } } if (pow_2 == true) { wynik++; } } } } if (b[0] >= mediana && b[b.size()-1] >= mediana) { if (b.size() > 1) { wynik++; } return; }else{ wynik--; zliczanie(b, mediana); } } int main() { cin >> n; vector <int> oceny(n); for (int i = 0; i < n; i++) { cin >> oceny[i]; } pierw = oceny[0]; ost = oceny[n-1]; double med = (n+1)/2; zliczanie(oceny, med); cout << n*2+1 << " " << wynik << endl; return 0; } |
English