P5076 【深基16.例7】普通二叉树(简化版)(BST、multiset

P5076 【深基16.例7】普通二叉树(简化版)(BST、multiset
题目描述

您需要写一种数据结构,来维护一些数( 都是 10^9以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数 qq不超过 10^4:

查询 x 数的排名(排名定义为比当前数小的数的个数 +1。若有多个相同的数,因输出最小的排名)。
查询排名为 x 的数。
求 x 的前驱(前驱定义为小于 x,且最大的数)。若未找到则输出 −2147483647。
求 x 的后继(后继定义为大于 x,且最小的数)。若未找到则输出 2147483647。
插入一个数 x。

输入输出样例
输入 #1
7
5 1
5 3
5 5
1 3
2 2
3 3
4 3
输出 #1
2
3
1
5

题解:
题目意思是要我们写一个二叉树。
偷懒
灵活变通!
但是可以用STL中的multiset来简化,注意可能有多个重复的数,所以用multiset。
前面我写过set,差不多了啦!
偷懒
QAQ

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define ll long long

multiset<int > num;
multiset<int >::iterator p,pr;
int main(){
    num.insert(-0x7fffffff);
    num.insert(0x7fffffff);
    int n,i,x,y,s;
    cin>>n;
    for(i=0;i<n;i++){
        cin>>x>>y;
        s=0;
        if(x==1) {
            p = num.begin();
            pr=num.lower_bound(y);
            while (p != pr) {
                s++;
                p++;
            }
            cout << s  << endl;
        }
        if(x==2){
            p=num.begin();
            while(s!=y){
                p++;
                s++;
            }
            cout<<*p<<endl;
        }
        if(x==3){
            p=num.lower_bound(y);
            while(*p>=y) p--;
            cout<<*p<<endl;
        }
        if(x==4){
            p=num.lower_bound(y);
            while(*p==y) p++;
            cout<<*p<<endl;
        }
        if(x==5){
            num.insert(y);
        }
    }
}

当x=1时,我用

if(x==1) {
            p = num.begin();
            pr=num.find(y);
            while (p != pr) {
                s++;
                p++;
            }
            cout << s  << endl;
        }

总是WA,后来搜了一下,

num.find(x)返回的是第一个插进去x的位置,不一定是multiset容器中第一个x的位置!

dalao们tql!!!
Orz!!!

你可能感兴趣的:(P5076 【深基16.例7】普通二叉树(简化版)(BST、multiset)