一道超级水的练习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; }