洛谷P3369 模板普通平衡树(STL做法:vector&multiset)
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷P3369 模板普通平衡树(STL做法:vector&multiset)相关的知识,希望对你有一定的参考价值。
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,但是不知道为啥
以上是关于洛谷P3369 模板普通平衡树(STL做法:vector&multiset)的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P3369 BZOJ 3224 模板普通平衡树(Treap/SBT)