NC51010. Black Box
描述
输入描述
Input contains (in given order): M, N, A(1), A(2), ..., A(M), u(1), u(2), ..., u(N). All numbers are divided by spaces and (or) carriage return characters.
输出描述
Write to the output Black Box answers sequence for a given sequence of transactions, one number each line.
示例1
输入:
7 4 3 1 -4 2 8 -1000 2 1 2 6 6
输出:
3 3 1 2
C++14(g++5.4) 解法, 执行用时: 14ms, 内存消耗: 1252K, 提交时间: 2020-03-25 16:13:41
/* 动态中位数的升级版本 使用对顶堆 以i为分割点,大根堆存储前半段,小根堆存储后半段 大根堆元素个数控制为i个,这样大根堆堆顶就是第i小的元素 */ #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=2e5+10; int n,m,a[N],K; priority_queue<int> q_max; priority_queue<int,vector<int>,greater<int> > q_min; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%d",&a[i]); int now=1; for(int i=1;i<=n;i++) { int x; scanf("%d",&x);//表示当插入了x个元素之后,就进行GET操作 for(int j=now;j<=x;j++) { q_max.push(a[j]); if(q_max.size()==i) q_min.push(q_max.top()),q_max.pop(); } now=x+1; printf("%d\n",q_min.top()); q_max.push(q_min.top()); q_min.pop(); } return 0; }
C++(g++ 7.5.0) 解法, 执行用时: 13ms, 内存消耗: 740K, 提交时间: 2022-10-18 08:38:54
#include<bits/stdc++.h> using namespace std; int m,n; int a[200010]; int main(){ scanf("%d %d",&m,&n); priority_queue<int>A; priority_queue<int,vector<int>,greater<int> >B; for(int i = 1; i <= m; i++){ scanf("%d",&a[i]); } int id = 1; for(int i = 1; i <= n; i++){ int u; scanf("%d",&u); for(int j = id; j <= u; j++){ A.push(a[j]); if(A.size() == i) B.push(A.top()),A.pop(); } id = u + 1; printf("%d\n",B.top()); A.push(B.top()); B.pop(); } return 0; }
C++ 解法, 执行用时: 34ms, 内存消耗: 780K, 提交时间: 2022-01-22 12:38:47
#include <bits/stdc++.h> using namespace std; const int N=9999999; int n, m,a[N],q[N],k=1; vector<int>v; int main() { cin>>n>>m; for(int i=1;i<= n;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>q[i]; sort(q+1,q+1+m); for(int i=1;i<=n;i++) { v.insert(lower_bound(v.begin(),v.end(),a[i]),a[i]); while(q[k]==i) { cout<<v[k-1]<<endl; k++; } } }