1 条题解

  • 0
    @ 2026-1-14 20:04:50
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;  // [1] 定义LL为long long类型,避免数据规模较大时溢出
    LL n,k,cnt,a[1000010];  // [2] n-恒星数量,k-K阶的阈值,cnt-统计K阶恒星系的数量,a-存储每个恒星的行星数
    bool l[1000010],r[1000010];  // [3] l[i]-标记第i个恒星“左边至少有k个元素小于a[i]”,r[i]-标记右边对应条件
    priority_queue<LL>lq,rq;  // [4] lq/rq-大顶堆,分别维护左/右侧元素,用于快速判断条件
    
    int main(){
        cin>>n>>k;  // [5] 输入恒星数量n和K阶的阈值k
        for(LL i=1;i<=n;i++){  // [6] 正序遍历,处理每个恒星的“左侧条件”
            cin>>a[i];  // [7] 输入第i个恒星的行星数
            // 堆内已有k个元素,且当前a[i]大于堆顶(堆顶是这k个元素的最大值)→ 左侧至少k个元素小于a[i]
            if(lq.size()==k&&a[i]>lq.top())l[i]=1;
            lq.push(a[i]);  // [8] 将当前元素加入堆,参与后续左侧元素的维护
            if(lq.size()>k)lq.pop();  // [9] 保持堆大小不超过k(弹出堆顶最大元素,堆内存左侧最小的k个元素)
        }
        for(LL i=n;i>=1;i--){  // [10] 倒序遍历,处理每个恒星的“右侧条件”
            // 堆内已有k个元素,且当前a[i]大于堆顶→ 右侧至少k个元素小于a[i]
            if(rq.size()==k&&a[i]>rq.top())r[i]=1;
            rq.push(a[i]);  // [11] 将当前元素加入堆,参与后续右侧元素的维护
            if(rq.size()>k)rq.pop();  // [12] 保持堆大小不超过k(弹出堆顶最大元素,堆内存右侧最小的k个元素)
        }
        for(LL i=1;i<=n;i++)if(r[i]&&l[i])cnt++;  // [13] 统计左右条件都满足的恒星数量
        cout<<cnt;  // [14] 输出K阶恒星系的总数
        return 0;
    }
    
    • 1

    信息

    ID
    1456
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者