2 条题解
-
1
#include <cstdio> #include <queue> #define Qmax priority_queue<int> #define Qmin priority_queue<int, vector<int>, greater<int> > #define f(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; int main() { int a[200001]; Qmax A; Qmin B; int n, m, r = 1, q; scanf("%d%d", &n, &m); f(i, 1, n) scanf("%d", &a[i]); f(i, 1, m) { scanf("%d", &q); f(j, r, q) { A.push(a[j]); if (A.size() == i) B.push(A.top()), A.pop(); } r = q + 1; printf("%d\n", B.top()); A.push(B.top()), B.pop(); } return 0; }
-
-1
这道题可以用优先队列解决,代码中使用了两个优先队列,一个大顶堆Qmax和一个小顶堆Qmin,分别用于存储当前窗口内的元素。
首先,定义了一个函数Input()用于快速读入输入数据。然后定义了一个数组a用于保存原始数据,以及两个变量n和m分别表示数组的长度和查询次数。
接下来,在主函数main()中,首先读入n、m和r的值。然后通过循环读入数组a的元素。
接着,开始进行查询操作。每次查询时,根据给定的范围位置q,将数组a中r到q的元素加入大顶堆A,并检查大顶堆的大小是否等于i。如果大小等于i,则将大顶堆的堆顶元素加入小顶堆B,并从大顶堆中移除该元素。
然后,更新r的值为q+1,表示下一个查询的起始位置。接着,输出小顶堆B的堆顶元素作为本次查询的答案。
最后,将小顶堆B的堆顶元素加入大顶堆A,同时从小顶堆B中移除该元素,为下一次查询做准备。
利用优先队列的性质,使得每次查询都能够在O(logN)的时间复杂度内得到答案。
#include <cstdio> #include <queue> #define Qmax priority_queue<int> #define Qmin priority_queue<int, vector<int>, greater<int> > #define f(i, a, b) for(int i = (a); i <= (b); i++) using namespace std; int main() { int a[200001]; Qmax A; Qmin B; int n, m, r = 1, q; scanf("%d%d", &n, &m); f(i, 1, n) scanf("%d", &a[i]); f(i, 1, m) { scanf("%d", &q); f(j, r, q) { A.push(a[j]); if (A.size() == i) B.push(A.top()), A.pop(); } r = q + 1; printf("%d\n", B.top()); A.push(B.top()), B.pop(); } return 0; }
- 1
信息
- ID
- 247
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 39
- 已通过
- 27
- 上传者