1 条题解
-
0
#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
- 上传者