1035. 二哥炒股票

Description

二哥最近关注了 N 支股票,编号为 1 至 N 。他不断记录下这 N 支股票的股价变动情况。在此期间,他也想知道其中股价第 i 高的是哪支。你能为他快速回答这这样的问题吗?

Input Format

第一行一个整数 N

第二行 N 个整数,第 i 个数表示编号为 i 的股票的初始股价

第三行一个整数 K

接下来 K 行,每行为一条股价变动记录或一条询问:

M x y 表示编号为 x 的股票的股价变成了 y。

Q r a1 a2 ... ar 表示二哥依次询问第 a1 大,第 a2 大...第 ar 大的股票编号为多少。若有不同股票的股价相同,那么令编号小的股票更大。

Output Format

对于每个询问,输出一行 r 个整数,第 i 个整数表示股价第 ai 大的股票编号为多少。这些整数之间用一个空格隔开。

Sample Input

6
1 2 3 4 5 6
5
Q 3 1 3 5
M 1 7
Q 3 1 3 5
M 2 5
Q 3 1 3 5

Sample Output

6 4 2
1 5 3
1 2 4

说明

对于每个询问,都有 r1000

,询问指令数量不超过 10 条

所有股价都不超过 105

40%的数据 3N,K100

70%的数据 3N,K5000

100%的数据 3N,K20000

 

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>

    using namespace std;

    void MAX_HEAPIFY(int A[], int data[], int n, int i){
        int l = 2*i+1;
        int r = 2*i+2;
        int largest = -1;
        if(l<n && data[A[l]]>data[A[i]]){
            largest = l;
        }else if(l<n && data[A[l]] == data[A[i]]){
            if(A[l]<A[i])
                largest = l;
            else
                largest = i;
        }else{
            largest = i;
        }
        if(r<n && data[A[r]]>data[A[largest]])
            largest = r;
        else if(r<n && data[A[r]]==data[A[largest]]){
            if(A[r]<A[largest])
                largest = r;
        }
        if(largest!=i){
            int temp = A[i];
            A[i] = A[largest];
            A[largest] = temp;
            MAX_HEAPIFY(A, data, n, largest);
        }
    }

    void BUILD_MAX_HEAP(int A[], int data[], int n){
        for(int i = n/2-1;i>=0;i--){
            MAX_HEAPIFY(A,data,n,i);
        }
    }

    void HEAPSORT(int query[], int data[], int n, int r){
        int A[n];
        for(int i = 0;i<n;i++)
            A[i] = i;
        BUILD_MAX_HEAP(A,data,n);

        int x = *max_element(query,query+r);
        int res[x];
        for(int i=0;i<x;i++){
            res[i] = A[0];
            n--;
            A[0] = A[n];
            MAX_HEAPIFY(A,data,n,0);
        }
        for(int y = 0; y<r; y++){
            cout<<res[query[y]-1]+1<<" ";
        }
        cout<<endl;
    }

    int main() {
        int n;
        cin>>n;
        int stock[n];
        for(int i=0;i<n;i++){
            scanf("%d",&stock[i]);
        }
//        for(int t = 0;t<n;t++)
//            cout<<stock[t]<<"	";

        int k;
        cin>>k;
        while(k-->0){
            char op;
            cin>>op;
            if(op=='Q'){
                int r;
                cin>>r;
                int query[r];
                for(int i = 0;i<r;i++){
                    int temp;
                    cin>>temp;
                    query[i] = temp;
                }
                HEAPSORT(query,stock,n,r);
            }else{
                int a,b;
                cin>>a>>b;
                stock[a-1] = b;
            }
        }

        return 0;
    }
原文地址:https://www.cnblogs.com/bernieloveslife/p/7966909.html