洛谷P3369 【模板】普通平衡树(STL做法:vector&multiset)
原创
©著作权归作者所有:来自51CTO博客作者小哈里1139的原创作品,请联系作者获取转载授权,否则将追究法律责任
problem
solution1 - AC
- vector可以AC。lower_bound找第一个大于等于x的,upper_bound找第一个大于x的。
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T; cin>>T;
vector<int>a;
while(T--){
int op, x; cin>>op>>x;
if(op==1){
a.insert(upper_bound(a.begin(),a.end(),x),x);
}else if(op==2){
a.erase(lower_bound(a.begin(),a.end(),x));
}else if(op==3){
cout<<lower_bound(a.begin(),a.end(),x)-a.begin()+1<<endl;
}else if(op==4){
cout<<a[x-1]<<endl;
}else if(op==5){
cout<<*--lower_bound(a.begin(),a.end(),x)<<endl;
}else{
cout<<*upper_bound(a.begin(),a.end(),x)<<endl;
}
}
return 0;
}
solution2 - WA
- multiset,不知道为啥WA一个点,还有一些TLE。
#include<bits/stdc++.h>
using namespace std;
multiset<int>se;
int main(){
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T; cin>>T;
while(T--){
int op, x; cin>>op>>x;
if(op==1){
se.insert(lower_bound(se.begin(),se.end(),x),x);
}else if(op==2){
se.erase(lower_bound(se.begin(),se.end(),x));
}else if(op==3){
cout<<distance(se.begin(),se.upper_bound(x))<<"\n";
}else if(op==4){
multiset<int>::iterator it =se.begin();
advance(it,x-1);
cout<<*it<<"\n";
}else if(op==5){
cout<<*--lower_bound(se.begin(),se.end(),x)<<endl;
}else{
cout<<*upper_bound(se.begin(),se.end(),x)<<endl;
}
}
return 0;
}
测试点6调试如下:看了一下有好几个位置都是比std多了1,但是不知道为啥