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
说明
对于每个询问,都有 r≤1000
,询问指令数量不超过 10 条
所有股价都不超过 105
40%的数据 3≤N
70%的数据 3≤N
100%的数据 3≤N
#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; }