分析
本题实质上就是对数据处理一下就可以了
就是数据结构实现题
我们要求对应索引下按照某种排序规则的线性表时 取最优时 可以用堆
每次拿出一个元素 堆内元素调整顺序
然后用三个堆 就可以表示三张表 每次我们得到顾客的一个喜欢颜色 就可以利用这个颜色去查堆
找到就输出 找不到就输出-1
本题在于把对应颜色作为下标 将元素存进来
用的时候就查表就行了减少遍历次数 将一张大表分成不同颜色的小表
code
using namespace std;
struct clo{
int p,id;
clo(int pr,int i):p(pr),id(i){}
friend bool operator<(const clo & cc,const clo & dd){
return dd.p < cc.p;
}
};
const int maxn = 200010;
priority_queue<clo>q[4];
int c[maxn],ans[maxn];
bool bok[maxn];
int main()
{
int t,n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&c[i]);
for(int i=1;i<=n;i++){
scanf("%d",&t);
q[t].push(clo(c[i],i));
}
for(int i=1;i<=n;i++){
scanf("%d",&t);
q[t].push(clo(c[i],i));
}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++){
int t;
scanf("%d",&t);
if(q[t].empty())ans[i] = -1;
else{
while(!q[t].empty()&&bok[q[t].top().id])q[t].pop();
if(q[t].empty()) ans[i]=-1;
else {
ans[i] = q[t].top().p;
bok[q[t].top().id]=1;
q[t].pop();
}
}
}
for(int i=1;i<=m;i++)
printf("%d%c",ans[i],i==m?'\n':' ');
return 0;
}