开三个数组,按价格顺序把含有这个颜色的衣服保存
需要的时候就找价格最小的,且没有被卖出去的衣服出来
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=200000+10;
struct node
{
int p;
int id;
bool operator < (const node &u) const
{
return p>u.p;
}
};
node p1[N],p2[N],p3[N];
int p[N];
int a[N],b[N];
int t1,t2,t3;
bool vis[N];
int main()
{
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&p[i]);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
t1=t2=t3=0;
for(int i=0;i<n;i++)
{
if(a[i]==1||b[i]==1)
p1[t1].p=p[i],p1[t1++].id=i;
if(a[i]==2||b[i]==2)
p2[t2].p=p[i],p2[t2++].id=i;
if(a[i]==3||b[i]==3)
p3[t3].p=p[i],p3[t3++].id=i;
}
sort(p1,p1+t1);
sort(p2,p2+t2);
sort(p3,p3+t3);
scanf("%d",&m);
int v;
t2--;t1--;t3--;
memset(vis,false,sizeof(vis));
while(m--)
{
scanf("%d",&v);
if(v==1)
{
while(t1>=0&&vis[p1[t1].id]) t1--;
if(t1>=0) printf("%d",p1[t1].p),vis[p1[t1].id]=true;
else printf("-1");
}
else if(v==2)
{
while(t2>=0&&vis[p2[t2].id]) t2--;
if(t2>=0) printf("%d",p2[t2].p),vis[p2[t2].id]=true;
else printf("-1");
}
else if(v==3)
{
while(t3>=0&&vis[p3[t3].id]) t3--;
if(t3>=0) printf("%d",p3[t3].p),vis[p3[t3].id]=true;
else printf("-1");
}
if(m) printf(" ");
else printf("\n");
}
return 0;
}