性感SGT(替罪羊树)cpp代码在线求调教,5WA,5TLE
查看原帖
性感SGT(替罪羊树)cpp代码在线求调教,5WA,5TLE
1087796
yangmeinaixi楼主2025/2/7 16:58
#include<bits/stdc++.h>
using namespace std;
const int n_sz=100010;
double alpha=0.75;
int n,cnt,rt,w[n_sz],l[n_sz],r[n_sz],num[n_sz],s[n_sz],sz[n_sz],sd[n_sz],reca[n_sz];
void pushup(int k)
{
	s[k]=s[l[k]]+s[r[k]]+1;
	sz[k]=sz[l[k]]+sz[r[k]]+num[k];
	sd[k]=sd[l[k]]+sd[r[k]]+(num[k]!=0);
}
bool needRec(int k)
{
	return num[k]&&(alpha*s[k]<=(double)max(s[l[k]],s[r[k]])||(double)sd[k]<=alpha*s[k]);
}
void Rec_dfs_mid(int& tot,int k)
{
	if(!k)return ;
	Rec_dfs_mid(tot,l[k]);
	if(num[k])reca[tot++]=k;
	Rec_dfs_mid(tot,r[k]);
}
int Rec_dfs_bld(int lr,int rr)
{
	int mid=(lr+rr)>>1;
	if(lr>=rr)return 0;
	l[reca[mid]]=Rec_dfs_bld(lr,mid);
	r[reca[mid]]=Rec_dfs_bld(mid+1,rr);
	pushup(mid);
	return reca[mid];
}
void Rec(int& k)
{
	int tot=0;
	Rec_dfs_mid(tot,k);
	k=Rec_dfs_bld(0,tot);
}
void insert(int& k,int p)
{
	if(!k)
	{
		k=++cnt;
		if(!rt)rt=1;
		w[k]=p;
		l[k]=r[k]=0;
		num[k]=s[k]=sz[k]=sd[k]=1;
	}
	else
	{
		if(w[k]==p)
		{
			num[k]++;
		}
		else if(w[k]<p)
		{
			insert(r[k],p);
		}
		else
		{
			insert(l[k],p);
		}
		pushup(k);
		if(needRec(k))Rec(k);
	}
}
void dlt(int& k,int p)
{
	if(!k)
	{
		return ;
	}
	else
	{
		if(w[k]==p)
		{
			num[k]--;
		}
		else if(w[k]<p)
		{
			insert(r[k],p);
		}
		else
		{
			insert(l[k],p);
		}
		pushup(k);
		if(needRec(k))Rec(k);
	}
}
int fprrk(int k,int p)
{
	pushup(k);
	if(!k)return 0;
	else if(w[k]==p&&num[k])
	    return sz[l[k]];
	else if(w[k]<p)
	    return sz[l[k]]+num[k]+fprrk(r[k],p);
	else
	    return fprrk(l[k],p);
}
int fnwrk(int k,int p)
{
	pushup(k);
	if(!k)return 0;
	else if(w[k]==p&&num[k])
	    return sz[l[k]]+1;
	else if(w[k]<p)
	    return sz[l[k]]+num[k]+fnwrk(r[k],p);
	else
	    return fnwrk(l[k],p);
}
int fntrk(int k,int p)
{
	pushup(k);
	if(!k)return 1;
	else if(w[k]==p&&num[k])
	    return sz[l[k]]+1+num[k];
	else if(p<w[k])
	    return fntrk(l[k],p);
	else
	    return sz[l[k]]+num[k]+fntrk(r[k],p);
}
int qv_by_rk(int k,int p)
{
	pushup(k);
	if(!k)return 0;
	else if(sz[l[k]]<p&&p<=sz[l[k]]+num[k])
	    return w[k];
	else if(sz[l[k]]+num[k]<p)
	    return qv_by_rk(r[k],p-sz[l[k]]-num[k]);
	else
	    return qv_by_rk(l[k],p);
}
int fpv(int k,int p)
{
	return qv_by_rk(k,fprrk(k,p));
}
int fnv(int k,int p)
{
	return qv_by_rk(k,fntrk(k,p));
}
main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int op,k;
		cin>>op>>k;
		if(op==1)insert(rt,k);
		else if(op==2)dlt(rt,k);
		else if(op==3){insert(rt,k);cout<<fnwrk(rt,k)<<"\n";dlt(rt,k);}
		else if(op==4)cout<<qv_by_rk(rt,k)<<"\n";
		else if(op==5)cout<<fpv(rt,k)<<"\n";
		else if(op==6)cout<<fnv(rt,k)<<"\n";
	}
}
//exit

2025/2/7 16:58
加载中...