problem

洛谷P3369 【模板】普通平衡树(STL做法:vector&multiset)_ci

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;
}

洛谷P3369 【模板】普通平衡树(STL做法:vector&multiset)_ci_02


测试点6调试如下:看了一下有好几个位置都是比std多了1,但是不知道为啥

洛谷P3369 【模板】普通平衡树(STL做法:vector&multiset)_c++_03