学习内容:cf补题,BUAA winter training 2补题
1.Meximum Array(1628a)
核心在于用set或数组维护不存在的数,每新来一个数,就从set或数组中删除该数
带删除的MEX(O(logn)):
struct MEX{
set<int>st;
int cnt[maxn];
multiset<int>mset;
void init(){
memset(cnt,0,sizeof(cnt));
for(int i=0;i<maxn;i++) st.insert(i);
}
void add(int x){
if(cnt[x]==0){
st.erase(x);
}
cnt[x]++;
mset.insert(x);
}
void del(int x){
if(cnt[x]==1){
st.insert(x);
}
cnt[x]--;
mset.erase(mset.find(x));
}
int mex(){ return *st.begin(); }
int size(){ return mset.size(); }
void clear(){
while (mset.size()){
del(*mset.begin());
}
}
};
不带删除的MEX(O(n)):
struct MEX{
int cnt[maxn];
vi res;
int id=0;
void add(int x){
res.pb(x);
cnt[x]++;
}
int mex(){
while (cnt[id]) id++;
return id;
}
void clear(){
id=0;
for(int x:res) cnt[x]--;
res.clear();
}
};
2.Peculiar Movie Preferences(cf1628b)
string的赋值今天才知道不能t[0]='c',t[1]='d'这种,要用push_back
看来有必要研读一下stl了qwq
reverse函数:reverse(t.begin(),t.end());
反向迭代器:if(s==string(s.rbegin(),rend()))