CF 799B T-shirt buying

一道超级水的练习STL的题目

题目大意:有\(n\)件T恤,每件T恤都分别有价格(每件衣服的价格不重复)、前面的颜色、背部的颜色三种属性。接下来有\(m\)个人每个人都有一种喜欢的颜色,他们按先后顺序选择衣服,如果没有喜欢的颜色的衣服了就输出\(-1\),否则选择其中符合条件的衣服中价值最小的。输出每个人要付出的钱。

注意到颜色只有三种,因此我们直接开三个set存储一下颜色懒得手写平衡树咯

每一次都在set中取出最小值(按价格排序),并在另一个set里删去这个数

时间复杂度\(O(n\ log n)\),这题是真的水

不用堆的原因就因为我不会手写,貌似STL优先队列不支持删除

CODE

#include<cstdio>
#include<cctype>
#include<set>
using namespace std;
const int N=200005;
set <int> s[3];
int n,m,p[N],x;
inline char tc(void)
{
    static char fl[100000],*A=fl,*B=fl;
    return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
    x=0; char ch; while (!isdigit(ch=tc()));
    while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
int main()
{
    //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
    register int i; read(n);
    for (i=1;i<=n;++i) read(p[i]);
    for (i=1;i<=n;++i) read(x),s[x-1].insert(p[i]);
    for (i=1;i<=n;++i) read(x),s[x-1].insert(p[i]);
    for (read(m),i=1;i<=m;++i)
    {
        read(x); if (!s[x-1].size()) { printf("-1 "); continue; }
        int now=*s[x-1].begin(); printf("%d ",now); s[0].erase(now); s[1].erase(now); s[2].erase(now);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/cjjsb/p/9439854.html