求助卡常大师,无O264分求助。
查看原帖
求助卡常大师,无O264分求助。
707513
LBYYSM_123楼主2023/8/13 16:27
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int biao=317;
const int lduan=biao/2,yduan=biao*2;
struct blocklist{
	struct kuai{
		vector<int> v;
	};list<kuai> l;
	blocklist(vector<int> lin){
		l.emplace_back();
		for(int i=0;i<lin.size();i++){
			l.back().v.emplace_back(lin[i]);
			if(l.back().v.size()==biao)
				l.emplace_back();
		}
		if(l.back().v.size()==0)
            l.emplace_back();
	}
	list<kuai>::iterator get(int lin){
		int wei=-2e9;
		if(l.size()==0) return l.begin();
		for(auto i=l.begin();i!=l.end();i++){
			if(wei<lin&&lin<=i->v.back())
				return i;
			wei=i->v.back();
		}
		return l.begin();
	}
	void insert(int p){
		auto i=get(p);
		i->v.emplace(lower_bound(i->v.begin(),i->v.end(),p),p);
		if(i->v.size()>yduan&&next(i)!=l.end()){
			vector<int> flo;
			for(auto k=i->v.end()-yduan;k!=i->v.end();k++)
				flo.emplace_back(*k);
			l.emplace(next(i),(kuai){flo});
			for(auto k=i->v.end()-yduan;k!=i->v.end();k++)
				i->v.erase(k);
		}
	}
	void erase(int p){
		auto i=get(p);
		i->v.erase(lower_bound(i->v.begin(),i->v.end(),p));
		if(i->v.size()<lduan&&next(i)!=l.end()){
			vector<int> lin;
			auto op=next(i);
			op->v.insert(op->v.begin(),i->v.begin(),i->v.end()); 
			auto next_i=next(i);
        	l.erase(i),i=next_i;
		}
	}
	int clt(int n){
		int ans=0;
		for(auto i=l.begin();i!=l.end();i++){
			if(i->v.back()<n)
				ans+=i->v.size();
			else{
				for(auto j=i->v.begin();j!=i->v.end();j++)
					if(*j<n)
						ans++;
					else
						break;
			}
		}
		return ans;
	}
	int kth(int n){
		for(auto i=l.begin();i!=l.end();i++){
			if(i->v.size()<n)
				n=n-i->v.size();
			else
				return i->v[n];
		}
		return -1;
	}
	int pre(int p){
    	auto i=get(p);
    	auto ps=lower_bound(i->v.begin(),i->v.end(),p);
    	if(ps==i->v.begin()){
        	if(i!=l.begin())
            	return prev(i)->v.back();
        	else
            	return -1;
    	}
    	return *prev(ps);
	}

	int nex(int p){
    	auto i=get(p);
    	auto ps=upper_bound(i->v.begin(),i->v.end(),p);
    	if(ps==i->v.end()){
        	if(next(i)!=l.end())
            	return next(i)->v.front();
        	else
            	return -1;
    	}
    	return *ps;
	}
};
blocklist tree=(vector<int>){INT_MIN,INT_MAX}; 
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
    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;
}
2023/8/13 16:27
加载中...