【题目】http://codeforces.com/problemset/problem/799/B
【题意】有n件衣服,每件的价格都不一样,每件衣服前后都有一种颜色,共有3种颜色,用1,2,3表示,来了m个客人,客人都是一个接一个来的,每个客人有一个自己喜欢的颜色,他会买有他喜欢颜色(无论正反面)的衣服中最便宜的那一件,如果没有的话,他就不会买了。现在要求输出每个客人付的钱数,没有买的话,输出-1。
【思路】因为只有3种颜色,我们可以建3个队列,将每件衣服反复放进它正/反面颜色对应的队列中,每次取出最便宜的那件,然后标记这个价格,如果再次取到这个价格就pop掉。所以要用map存一下用过的衣服的价格。
要注意每个衣服会在不同的队列重复出现,所以要有book记录已经卖出的衣服。
第一次写的时候竟然开vector,每卖出一件就去所有的颜色里搜出这件衣服erarse掉..算了算复杂度不会T啊..但就是T了...可能是erase太慢了??不懂....I'm too vegetable...
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M=2e5+5;
map<int,int>book;//标记被买走的衣服
queue<int>q[4];//q[1],q[2],q[3]分别表示123三种颜色
struct node
{
int w, a,b;//衣服的价格,正/反颜色
} x[M];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&x[i].w);
}
for(int i=0; i<n; i++)
{
scanf("%d",&x[i].a);
}
for(int i=0; i<n; i++)
{
scanf("%d",&x[i].b);
}
sort(x,x+n,cmp);//把衣服按照价格从小到大排序
for(int i=0; i<n; i++)
{
for(int j=1; j<=3; j++)
{
if(x[i].a==j||x[i].b==j)
{
q[j].push(x[i].w);//按照颜色放进相应队列
}
}
}
int m;
scanf("%d",&m);
for(int i=0; i<m; i++)
{
int t;
scanf("%d",&t);
if(q[t].empty())//如果他要的这个颜色已经没衣服了
printf("-1 ");
else
{
//将前面被买走的衣服去掉
while(book[q[t].front()]!=0)
q[t].pop();
if(q[t].empty())//如果空了
{
printf("-1 ");
continue;
}
if(book[q[t].front()]==0)
{
printf("%d ",q[t].front());
book[q[t].front()]=1;//标记这件衣服已经卖出
q[t].pop();
}
}
}
puts("");
}