洛谷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 模板普通平衡树(Treap/SBT)

洛谷 P3369 BZOJ 3224 模板普通平衡树(Treap/SBT)

题解 P3369 模板普通平衡树(Treap/SBT)

洛谷P3369普通平衡树(splay)

luogu P3369 模板普通平衡树(Treap/SBT) 题解 pb_ds

P3369 模板普通平衡树 题解(Splay)