#include <algorithm>
#include <iostream>
#include <vector>
#include <unordered_map>
#include <set>
using namespace std;
const int P = 1000000000 + 7;
int main() {
std::ios::sync_with_stdio(false);
int n, x;
cin >> n;
vector<int> ranks;
set<int> visited;
unordered_map<int, int> rank_idx;
for(int i = 0; i < n; ++i) {
cin >> x;
ranks.push_back(x);
rank_idx[x] = i;
}
int left = rank_idx[n], right = rank_idx[n];
long long solutions = 0;
visited.insert(n);
for(int next = n; next >= (n + 1) / 2; --next) {
if(visited.find(next) == visited.end()) {
int next_pos = rank_idx[next];
while(next_pos < left) {
--left;
visited.insert(ranks[left]);
}
while(next_pos > right) {
++right;
visited.insert(ranks[right]);
}
}
int desired_size, missing, window;
if(2 * next != n) {
desired_size = 2 * (n - next) + 1; // 1-element median
missing = desired_size - visited.size();
if(missing >= 0) {
window = min(missing, left) + min(missing, n - right - 1);
solutions += window - missing + 1;
}
}
if(next < n) { // 2-elements median
desired_size = 2 * (n - next - 1) + 2;
missing = desired_size - visited.size();
if(missing >= 0) {
window = min(missing, left) + min(missing, n - right - 1);
solutions += window - missing + 1;
}
}
}
cout << 2 * n + 1 << " " << solutions << endl;
}
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 | #include <algorithm> #include <iostream> #include <vector> #include <unordered_map> #include <set> using namespace std; const int P = 1000000000 + 7; int main() { std::ios::sync_with_stdio(false); int n, x; cin >> n; vector<int> ranks; set<int> visited; unordered_map<int, int> rank_idx; for(int i = 0; i < n; ++i) { cin >> x; ranks.push_back(x); rank_idx[x] = i; } int left = rank_idx[n], right = rank_idx[n]; long long solutions = 0; visited.insert(n); for(int next = n; next >= (n + 1) / 2; --next) { if(visited.find(next) == visited.end()) { int next_pos = rank_idx[next]; while(next_pos < left) { --left; visited.insert(ranks[left]); } while(next_pos > right) { ++right; visited.insert(ranks[right]); } } int desired_size, missing, window; if(2 * next != n) { desired_size = 2 * (n - next) + 1; // 1-element median missing = desired_size - visited.size(); if(missing >= 0) { window = min(missing, left) + min(missing, n - right - 1); solutions += window - missing + 1; } } if(next < n) { // 2-elements median desired_size = 2 * (n - next - 1) + 2; missing = desired_size - visited.size(); if(missing >= 0) { window = min(missing, left) + min(missing, n - right - 1); solutions += window - missing + 1; } } } cout << 2 * n + 1 << " " << solutions << endl; } |
English