98 pts MLE 求卡空间球球了啊啊啊破防了
查看原帖
98 pts MLE 求卡空间球球了啊啊啊破防了
347664
菲斯斯夫斯基楼主2024/11/20 20:08

如题。怎么还卡空间这么恶心!

求大佬帮忙,球球求求求了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,cnt,tot;
long long ans,a,b;
int rt[N];
struct ccf
{
	int l,r;
	long long x;
}f[N<<6];
void build(int &k,int l,int r,int x)
{
	k=++tot;
	if(l==r)return f[k].x++,void();
	int mid=(l+r)/2;
	if(x<=mid)build(f[k].l,l,mid,x);
	else build(f[k].r,mid+1,r,x);
	f[k].x=f[f[k].l].x+f[f[k].r].x;
}
int merge(int x,int y,int l,int r)
{
	if(!x)return y;
	if(!y)return x;
	if(l==r)return f[x].x+=f[y].x,x;
	int mid=(l+r)/2;
	a+=f[f[x].l].x*f[f[y].r].x,b+=f[f[x].r].x*f[f[y].l].x;
	f[x].l=merge(f[x].l,f[y].l,l,mid);
	f[x].r=merge(f[x].r,f[y].r,mid+1,r);
	f[x].x=f[f[x].l].x+f[f[x].r].x;
	return x;
}
int dfs()
{
	int k;
	cin>>k;
	if(k==0)
	{
		int l=dfs(),r=dfs();
		a=b=0;
		rt[l]=merge(rt[l],rt[r],1,n);
		ans+=min(a,b);
		return l;
	}
	else
	{
		build(rt[++cnt],1,n,k);
		return cnt;
	}
}
signed main()
{
	cin>>n;
	dfs();
	cout<<ans;
	return 0;
}
2024/11/20 20:08
加载中...