一道超級水的練習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; }