题目如下

一包共 nn 件T恤被送到了商店。每件T恤被三个正整数 pipi , aiai 和 bibi 所描述。 pipi 是第 ii 件T恤的价格, aiai 是第 ii 件T恤正面的颜色, bibi 是第 ii 件T恤背面的颜色。所有 pipi 都各不相同, aiai 和 bibi 都是1~3的整数。

有 mm 个顾客,每人都仅想买一件T恤。第 ii 个顾客最喜欢的颜色是 cjcj 。

如果一件T恤至少一面(前或后)的颜色是顾客喜欢的,他才会将其买下;如果有多件T恤符合条件,他会选择最便宜的;如果没有符合条件的,他什么都不会买。我们假定顾客都乖巧地排着队一个一个来,前一个顾客走后第二个才能被接待。

你需要计算每个顾客分别花了多少钱。

输入格式:

 

The first line contains single integer nn ( 1n2000001<=n<=200000 ) — the number of t-shirts.

The following line contains sequence of integers p1p2...pnp1,p2,...,pn ( 1pi10000000001<=pi<=1000000000 ), where pipiequals to the price of the ii -th t-shirt.

The following line contains sequence of integers a1a2...ana1,a2,...,an ( 1ai31<=ai<=3 ), where aiai equals to the front color of the ii -th t-shirt.

The following line contains sequence of integers b1b2...bnb1,b2,...,bn ( 1bi31<=bi<=3 ), where bibi equals to the back color of the ii -th t-shirt.

The next line contains single integer mm ( 1m2000001<=m<=200000 ) — the number of buyers.

The following line contains sequence c1c2...cmc1,c2,...,cm ( 1cj31<=cj<=3 ), where cjcj equals to the favorite color of the jj -th buyer. The buyers will come to the shop in the order they are given in the input. Each buyer is served only after the previous one is served.

 

输出格式:

 

Print to the first line mm integers — the jj -th integer should be equal to the price of the t-shirt which the jj -th buyer will buy. If the jj -th buyer won't buy anything, print -1.

 

 

  这道题其实就是一个很简单的优先队列的调用。因为数据很大,单独循环会T。所以我们使用优先队列,并按照颜色的不同将结构体存入优先队列,每个人遍历一遍队列。由于价格从小到大,我们需要重载运算符。关于重载运算符的话,我此前学过很多次小詹的代码,但是总是记不住,今天试着用friend写一下,瞬间觉得充满了美感。

 

1 friend bool operator < (Node x,Node y)
2 
3 {
4   return x.minn < y.minn;
5 }

 

 

 

此题具体代码如下:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 typedef long long ll;
 7 int read()
 8 {
 9     int a = 0, b = 1;
10     char c = getchar();
11     while(c < '0' or c > '9')
12     {
13         if(c == '-') b = -1;
14         c = getchar();
15     }
16     while(c >= '0' and c <= '9')
17     {
18         a = a*10 + c - '0';
19         c = getchar();
20     }
21     return a*b;
22 }
23 ll a[100005],b[100005],p[100005],n,vis[100005],t,m;
24 struct node
25 {
26     int a,b,num,p;
27     bool operator < (const node & other)const
28     {
29         return p > other.p || (p == other.p && num > other.num);
30     }
31 }e[10000005];
32 int main()
33 {
34     priority_queue<node>k[4];
35     n = read();
36     for(int i=1; i<=n; i++) e[i].num = i;
37     for(int i=1; i<=n; i++) e[i].p = read();
38     for(int i=1; i<=n; i++) {e[i].a = read();k[e[i].a].push(e[i]);}
39     for(int i=1; i<=n; i++) {e[i].b = read();k[e[i].b].push(e[i]);}
40     m = read();
41     for(int i=1; i<=m; i++)
42     {
43         t = read();
44         if(k[t].empty())
45         {
46             printf("-1\n");
47             continue;
48         }
49         int c = k[t].top().num;
50         while(vis[c] == 1)
51         {
52             if(k[t].empty())
53             {
54                 break;
55             }
56             k[t].pop();
57             c = k[t].top().num;
58         }
59         if(!k[t].empty())
60         {printf("%d ",e[c].p);k[t].pop();}
61         else
62         printf("-1\n");
63         vis[c] = 1;
64     }
65     return 0;
66 }