2 条题解

  • 1
    @ 2024-4-19 19:56:11
    #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
      @ 2023-8-1 18:00:20

      这道题可以用优先队列解决,代码中使用了两个优先队列,一个大顶堆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
      上传者