CF 799B T-shirt buying

一道超級水的練習STL的題目git

題目大意:有\(n\)件T恤,每件T恤都分別有價格(每件衣服的價格不重複)、前面的顏色、背部的顏色三種屬性。接下來有\(m\)我的每一個人都有一種喜歡的顏色,他們按前後順序選擇衣服,若是沒有喜歡的顏色的衣服了就輸出\(-1\),不然選擇其中符合條件的衣服中價值最小的。輸出每一個人要付出的錢。spa

注意到顏色只有三種,所以咱們直接開三個set存儲一下顏色懶得手寫平衡樹咯code

每一次都在set中取出最小值(按價格排序),並在另外一個set裏刪去這個數排序

時間複雜度\(O(n\ log n)\),這題是真的水隊列

不用堆的緣由就由於我不會手寫,貌似STL優先隊列不支持刪除it

CODEio

#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;
}
相關文章
相關標籤/搜索