错了,块状链表,求助!!!!
查看原帖
错了,块状链表,求助!!!!
707513
LBYYSM_123楼主2023/8/11 16:57
#include<bits/stdc++.h>
using namespace std;
const int sz=317,th=2*sz;
typedef int var;
struct SK{
	SK(vector<var> q){
        sort(q.begin(),q.end());
        dt.emplace_back();
        for(int i=0;i<q.size();i++){
            dt.back().emplace_back(q[i]);
            if(dt.back().size()==sz) 
				dt.emplace_back();
        }
        if(dt.back().size()==0)
			dt.emplace_back();
    }
    vector<vector<var>> dt;
    int get(int lin){
        int wei=-2e9;
        if(dt.size()==0) return -1;
        for(int i=0;i<dt.size();i++){
            if(wei<lin&&lin<=dt[i].back())
                return i;
            wei=dt[i].back();
        } 
        return -1;
    }
    void insert(int p){
        int i=get(p);
        dt[i].emplace(lower_bound(dt[i].begin(),dt[i].end(),p),p);
        if(dt[i].size()>th){
            dt.emplace(dt.begin()+i+1,dt[i].end()-sz,dt[i].end());
            dt[i].erase(dt[i].end()-sz,dt[i].end());
        }
    }
    void erase(int p){
        int i=get(p);
        dt[i].erase(lower_bound(dt[i].begin(),dt[i].end(),p));
        if(dt[i].size()<sz/4){
        	merge(dt[i].begin(),dt[i].end(),dt[i+1].begin(),dt[i+1].end(),dt[i+1].begin());
			dt.erase(dt.begin()+i);	
		}
    }
    int kth(int n){
        for(auto i:dt){
            if(i.size()<=n)
                n-=i.size();
            else
                return i[n];
        }
        return -1;
    }
    int clt(int n){
        int ans=0;
        for(auto i:dt){
            if(i.back()<n)
                ans+=i.size();
            else{
                for(auto j:i)
                    if(j<n)
                        ans++;
                    else
                        break;
            }
        }
        return ans;
    }
    int pre(int p){
        int i=get(p);
        auto ps=lower_bound(dt[i].begin(),dt[i].end(),p);
        if(ps==dt[i].begin())
            return dt[i-1].back();
        return *prev(ps);
    }
    int nex(int p){
        int i=get(p);
        auto ps=upper_bound(dt[i].begin(),dt[i].end(),p);
        if(ps==dt[i].end())
            return dt[i+1].front();
        return *ps;
    }
};
vector<int> lin={INT_MIN,INT_MAX};
vector<var> t;
signed main(){
	SK tree=lin;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int opt;
        cin>>opt;
        if(opt==1){
            int lin;
            cin>>lin;
            tree.insert(lin);
        }
        else if(opt==2){
            int lin;
            cin>>lin;
            tree.erase(lin);
        }
        else if(opt==3){
            int lin;
            cin>>lin;
            cout<<tree.clt(lin)<<endl;
        }
        else if(opt==4){
            int lin;
            cin>>lin;
            cout<<tree.kth(lin)<<endl;
        }
        else if(opt==5){
            int lin;
            cin>>lin;
            cout<<tree.pre(lin)<<endl;
        }
        else if(opt==6){
            int lin;
            cin>>lin;
            cout<<tree.nex(lin)<<endl;
        }
    }
    return 0;
}

开 O2 20分,不开就 8 分。

2023/8/11 16:57
加载中...