0
点赞
收藏
分享

微信扫一扫

Codeforces 799B -T-shirt buying(SET)

Xin_So 2023-03-02 阅读 96



有 n 件T恤。第 i 件T恤的价格为 pi 。每个T恤有两面,第 i 件T恤正面颜色为 ai ,反面颜色为 bi

有 m 个人想买T恤,每个人都恰好买一件。第 j 个人最喜欢颜色 cj

一个人会选择买一件至少有一面颜色为他喜欢的颜色的,最便宜的T恤。如果没有合法的T恤,则不买。这些人按照给定的顺序来购买。

你的任务是求出每个人会花多少钱。

Input


第一行包含一个整数 n (1 ≤ n) — 表示T恤的数量。

之后一行为 p1, p2, ..., pn (1 ≤ pi ≤ 1 000 000 000), pi 表示第 i

之后一行为 a1, a2, ..., an (1 ≤ ai ≤ 3), ai 表示第 i

之后一行为 b1, b2, ..., bn (1 ≤ bi ≤ 3), bi 表示第 i

之后一行包含一个整数 m (1 ≤ m) — 表示消费者人数。

之后一行为 c1, c2, ..., cm (1 ≤ cj ≤ 3), where cj表示第 j

Output


一行 m 个数 — 第 j 个数表示第 j-th buyer will buy. If the j 个消费者需要花的钱数。如果不购买,输出 -1。

Example


Input



5 300 200 400 500 911 1 2 1 2 3 2 1 3 2 1 6 2 3 1 2 1 1



Output



200 400 300 500 911 -1



Input



2 1000000000 1 1 1 1 2 2 2 1



Output



1 1000000000


代码如下:

#include <iostream>
#include <set>
using namespace std;
const int INF=0x3f3f3f3f;
struct stu
{
int price;
int aa;
int bb;
}clo[200001];
//之前的方法 循环超时 利用 set 自动 选择最小
int main()
{
int n,m;
set<int>s[4];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>clo[i].price;
}
for(int i=1;i<=n;i++)
{
cin>>clo[i].aa;
}
for(int i=1;i<=n;i++)
{
cin>>clo[i].bb;
}
for(int i=1;i<=n;i++)
{
s[clo[i].aa].insert(clo[i].price);
s[clo[i].bb].insert(clo[i].price);
}
cin>>m;
int k;
for(int j=1;j<=m;j++)
{
cin>>k;
if(s[k].empty())
{
cout<<"-1"<<" ";
}else
{
int ans=*(s[k].begin());
cout<<ans<<" ";
for(int i=1;i<=3;i++)//三种颜色
{
s[i].erase(ans);//清除掉已经买的衣服
}
}

}
return 0;
}

举报

相关推荐

0 条评论