替罪羊树30ptsTLE求条
查看原帖
替罪羊树30ptsTLE求条
1180206
Alex866楼主2025/7/23 14:06
#include<bits/extc++.h>
using namespace std;
using namespace chrono;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
#if 1
using ll=long long;
using uint=unsigned int;
using ull=unsigned long long;
using db=double;
using ldb=long double;
#ifdef _INT128_DEFINED
using i128=__int128;
using ui128=unsigned __int128;
#endif
//#define ONLINE_JUDGE
//#define _INT_TO_LL
#define _CLOSE_SYNC
//#define _USE_FREOPEN
#if __cplusplus>=201103L
//#define _RAND_USE_Mt19937
#define _UM(_Key,_Type) unordered_map<_Key,_Type>
#define _US(_Type) unordered_set<_Type>
#define _UMM(_Key,_Type) unordered_multimap<_Key,_Type>
#define _UMS(_Type) unordered_multiset<_Type>
#define tostr(_Name) std::to_string(_Name)
#else
#define constexpr const
#endif
#define y0 __Y0_By_MySelf__
#define y1 __Y1_By_MySelf__
#define yn __Yn_By_MySelf__
#define j0 __J0_By_MySelf__
#define j1 __J1_By_MySelf__
#define jn __Jn_By_MySelf__
#define __lcm(_A,_B) ((_A)/__gcd((_A),(_B))*(_B))
#define _GPQ(_Type) std::priority_queue<_Type,vector<_Type>,greater<_Type>>
#define _SPQ(_Type,_Cmp) std::priority_queue<_Type,vector<_Type>,_Cmp>
#define _FPQ(_Type,_Cmp) std::priority_queue<_Type,vector<_Type>,decltype(&_Cmp)>
#define _PQ(_Type) std::priority_queue<_Type>
#define _MM(_Key,_Type) multimap<_Key,_Type>
#define _MS(_Type) multiset<_Type>
#define _P(_Type) pair<_Type,_Type>
#define _V(_Type) vector<_Type>
#define mem(_Num,_Arr) memset((_Arr),(_Num),sizeof(_Arr))
#define clr(_Arr) memset((_Arr),0,sizeof(_Arr))
#define neg(_Arr) memset((_Arr),-1,sizeof(_Arr))
#define fmax(_Arr) memset((_Arr),0x7f,sizeof(_Arr))
#define fmax_s(_Arr) memset((_Arr),0x3f,sizeof(_Arr))
#define fmin(_Arr) memset((_Arr),0x80,sizeof(_Arr))
#define fmin_s(_Arr) memset((_Arr),0xc0,sizeof(_Arr))
#define four_d(_Name) constexpr int _Name[4][2]={{0,1},{1,0},{0,-1},{-1,0}}
#define eight_d(_Name) constexpr int _Name[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
#define _FF(_Name,_Begin,_End) for(auto _Name=(_Begin);_Name<(_End);_Name++)
#define _RF(_Name,_Begin,_End) for(auto _Name=(_Begin);_Name>(_End);_Name--)
#define _FE(_Container,...) for(auto _Name:__VA_ARGS__)
#define _SP(_Digit) fixed<<setprecision(_Digit)
#define _Case(_Value,...) case _Value:__VA_ARGS__;break
#ifndef ONLINE_JUDGE
#define _p(_X,_F) cerr<<(_X)<<" \n"[_F]<<flush
#define _psth cerr<<"\n--------------------"<<__LINE__<<"---------------------\n"<<flush
#define _pel cerr<<'\n'<<flush
#else
#define _p(_X,_F)
#define _psth
#define _pel
#endif
#ifdef _INT_TO_LL
#define int long long
#endif
#ifdef _RAND_USE_Mt19937
mt19937_64 __Random_Number__(system_clock::now().time_since_epoch().count());
#ifdef _INT_TO_LL
uniform_int_distribution<ull> __Random_Dist__(0,LLONG_MAX);
#else
uniform_int_distribution<uint> __Random_Dist__(0,INT_MAX);
#endif
#define rand() __Random_Dist__(__Random_Number__)
#define srand(__X) __Random_Number__.seed(__X)
#endif
constexpr ull HashP=1313131313131313131ull,HashP1=1111111111111111171ull,HashP2=37093201209218101ull,HashP3=3113333333333333333ull,HashP4=4444444444444444409ull,HashP5=370903201209218177ull;
constexpr int mod3=998244353,mod7=1000000007,mod9=1000000009;
using _Pi=pair<int,int>;
using _Vi=vector<int>;
using _Vpi=vector<_Pi>;
#endif
constexpr db alpha=.7;
struct{
	int l,r,v,t,s,d;
}t[1000005];
int ord[1000005],cnt,r=0,q,opt,x;
stack<int> st;
void inord(int u){
	if(!u){
		return;
	}
	inord(t[u].l);
	if(t[u].d){
		ord[++cnt]=u;
	}else{
		st.push(u);
	}
	inord(t[u].r);
}
void init(int u){
	t[u].l=t[u].r=0;
	t[u].s=t[u].t=t[u].d=1;
}
void pushup(int u){
	t[u].s=t[t[u].l].s+t[t[u].r].s+t[u].d;
	t[u].t=t[t[u].l].t+t[t[u].r].t+1;
}
void build(int l,int r,int& u){
	int mid=l+r>>1;
	u=ord[mid];
	if(l==r){
		init(u);
		return;
	}else if(l<mid){
		build(l,mid-1,t[u].l);
	}else if(l==mid){
		t[u].l=0;
	}
	build(mid+1,r,t[u].r);
	pushup(u);
}
void rebuild(int& u){
	cnt=0;
	inord(u);
	if(cnt){
		build(1,cnt,u);
	}else{
		u=0;
	}
}
bool check(int u){
	if(db(t[u].s)*alpha<=db(max(t[t[u].l].s,t[t[u].r].s))){
		return 1;
	}
	return 0;
}
void insert(int& u,int x){
	if(!u){
		u=st.top();
		st.pop();
		t[u].v=x;
		init(u);
		return;
	}
	t[u].s++;
	t[u].t++;
	if(t[u].v>=x){
		insert(t[u].l,x);
	}else{
		insert(t[u].r,x);
	}
	if(check(u)){
		rebuild(u);
	}
}
int rnk(int u,int x){
	if(!u){
		return 0;
	}
	if(x>t[u].v){
		return t[t[u].l].s+t[u].d+rnk(t[u].r,x);
	}else{
		return rnk(t[u].l,x);
	}
}
int kth(int u,int k){
	if(t[u].d&&t[t[u].l].s+1==k){
		return t[u].v;
	}else if(t[t[u].l].s>=k){
		return kth(t[u].l,k);
	}else{
		return kth(t[u].r,k-t[t[u].l].s-t[u].d);
	}
}
void delkth(int &u,int k){
	t[u].s--;
	if(t[u].d&&t[t[u].l].s+1==k){
		t[u].d=0;
		return;
	}
	if(t[t[u].l].s+t[u].d==k){
		delkth(t[u].l,k);
	}else{
		delkth(t[u].r,k-t[t[u].l].s-t[u].d);
	}
}
void del(int x){
	delkth(r,rnk(r,x)+1);
	if(t[r].t*alpha>=t[r].s){
		rebuild(r);
	}
}
signed main(){
#ifdef _USE_FREOPEN
	ifstream cin(".in");
	ofstream cout(".out");
#endif
#ifdef _CLOSE_SYNC
	cin.tie(0)->sync_with_stdio(0);
#endif
	_FF(i,1,1000005){
		st.push(1000005-i);
	}
	cin>>q;
	while(q--){
		cin>>opt>>x;
		switch(opt){
			_Case(1,insert(r,x));
			_Case(2,del(x));
			_Case(3,cout<<rnk(r,x)+1<<'\n');
			_Case(4,cout<<kth(r,x)<<'\n');
			_Case(5,cout<<kth(r,rnk(r,x))<<'\n');
			_Case(6,cout<<kth(r,rnk(r,x+1)+1)<<'\n');
		}
	}
	return 0;
}
2025/7/23 14:06
加载中...