Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <unordered_map>
- using namespace std;
- void solve() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int N, B;
- cin >> N >> B;
- vector<int> A(N);
- int pos = -1;
- for (int i = 0; i < N; i++) {
- cin >> A[i];
- if (A[i] == B)
- pos = i;
- }
- // Преобразуем массив:
- // если A[i] < B -> -1
- // если A[i] > B -> +1
- // если A[i] == B -> 0.
- vector<int> T(N);
- for (int i = 0; i < N; i++) {
- if (A[i] < B)
- T[i] = -1;
- else if (A[i] > B)
- T[i] = 1;
- else
- T[i] = 0;
- }
- // Вычисляем префиксные суммы:
- // prefix[0] = 0, prefix[i+1] = prefix[i] + T[i].
- vector<long long> prefix(N + 1, 0);
- for (int i = 0; i < N; i++) {
- prefix[i + 1] = prefix[i] + T[i];
- }
- // Заметим, что подотрезок [l, r] (включительно) содержит B, если l <= pos <= r.
- // Для такого подотрезка медиана равна B тогда и только тогда,
- // когда сумма его элементов равна 0, то есть:
- // prefix[r+1] - prefix[l] == 0 <=> prefix[r+1] == prefix[l].
- // Посчитаем для всех l из [0, pos] частоты значений prefix[l],
- // а затем для каждого j из [pos+1, N] прибавим количество prefix[j] из левой части.
- unordered_map<long long, long long> freq;
- for (int i = 0; i <= pos; i++) {
- freq[prefix[i]]++;
- }
- long long ans = 0;
- for (int j = pos + 1; j <= N; j++) {
- ans += freq[prefix[j]];
- }
- cout << ans << "\n";
- }
- int main() {
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement