牛客练习赛87 B k小数查询(STL)

题目链接
牛客练习赛87 B k小数查询(STL)_第1张图片
牛客练习赛87 B k小数查询(STL)_第2张图片
由于序列是n的一个排列,那么问题就十分简单啦。先找到x所在的位置然后左右扩展做乘法原理就行了。

unordered_map<int, int> L;
unordered_map<int, int> R;
int a[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, x, k;
    cin >> n >> x >> k;
    int pos;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        if (x == a[i])
            pos = i;
    }
    int cnt = 0;
    ll ans = 0;
    //区间内有k-1个比x小的数
    for (int i = pos - 1; i >= 1; i--)
    {
        if (a[i] < x)
            cnt++;
        L[cnt]++;
        if (cnt == k - 1)//左
            ans++;
    }
    cnt = 0;
    for (int i = pos + 1; i <= n; i++)
    {
        if (a[i] < x)
            cnt++;
        R[cnt]++;
        if (cnt == k - 1)//右
            ans++;
    }
    for (auto v : L)
    {
        int kk = v.first;
        if (kk > k - 1)
            continue;
        ans += v.second * R[k - 1 - kk];//左右
    }
    if (k == 1)//本身
        ans++;
    cout << ans << endl;
    return 0;
}

你可能感兴趣的:(牛客练习赛87 B k小数查询(STL))