有 n 件T恤。第 i 件T恤的价格为 pi 。每个T恤有两面,第 i 件T恤正面颜色为 ai ,反面颜色为 bi 。
有 m 个人想买T恤,每个人都恰好买一件。第 j 个人最喜欢颜色 cj。
一个人会选择买一件至少有一面颜色为他喜欢的颜色的,最便宜的T恤。如果没有合法的T恤,则不买。这些人按照给定的顺序来购买。
你的任务是求出每个人会花多少钱。
Input
第一行包含一个整数 n (1 ≤ n ≤ 200 000) — 表示T恤的数量。
之后一行为 p1, p2, ..., pn (1 ≤ pi ≤ 1 000 000 000), pi 表示第 i 件T恤的价格。
之后一行为 a1, a2, ..., an (1 ≤ ai ≤ 3), ai 表示第 i 件T恤正面的颜色。
之后一行为 b1, b2, ..., bn (1 ≤ bi ≤ 3), bi 表示第 i 件T恤背面的颜色。
之后一行包含一个整数 m (1 ≤ m ≤ 200 000) — 表示消费者人数。
之后一行为 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 <cstring>
#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;
const int maxn = 200010;
set<int> st[4];
int pri[maxn];
int main() {
int n, temp, m;
while(cin >> n)
{
for (int i = 0; i < n; i++)
cin >> pri[i];
for (int i = 0; i < n; i++)
cin >> temp, st[temp].insert(pri[i]);
for (int i = 0; i < n; i++)
cin >> temp, st[temp].insert(pri[i]);
cin >> m;
while (m--) {
cin >> temp;
if (st[temp].size() == 0) {
cout << -1 << " ";
continue;
}
temp = *(st[temp].begin());
cout << temp << " ";
for (int j = 1; j <= 3; j++)
if ( st[j].find(temp)!= st[j].end())
st[j].erase(st[j].find(temp));
}
cout<<endl;
}
return 0;
}
一、队列(queue 先进先出)
头文件:#include <queue>
声明:queue<T>q; (T 表示类型, q 表示变量名)
基本操作:
1、q.push(a) 在队列末尾加入一个元素a
2、q.pop() 删除队列q的第一个元素
3、q.front() 返回队列q的第一个元素
4、q.back() 返回队列q的最后一个元素
5、q.empty() 如果队列q为空则返回真
6、q.size() 返回队列q中元素的个数
二、优先队列(priority_queue)
头文件:#include <queue>
声明:priority_queue<T>q; (默认从大到小排序)
priority_queue<T ,vector<T> ,greater<T> > (从小到大排序)
对于优先队列里元素的一个结构体类型,可对比较函数进行重载,使其按照某一个属性排序
基本操作:
1、q.push(a) 在队列中加入一个元素
2、q.pop()
3、q.top()
4、q.size()
5、q.empty()