替罪羊思想的平衡树T了,求调(玄1关)
查看原帖
替罪羊思想的平衡树T了,求调(玄1关)
1058570
tzhengqing楼主2024/7/12 14:38

比暴力还差,跟shit一样

#include<bits/stdc++.h>
using namespace std;
struct node
    {
    int ls,rs,v;
    }a[32768];
long long n,ans=0,cnt=0,z[100005],l=0,r=0;
inline int read() 
    {
    int num=0,w=1; char ch=0;
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar(); }
    while(ch>='0'&&ch<='9') num=(num<<3)+(num<<1)+ch-'0',ch=getchar();
    return num*w;
    }
int ins(int pre,int x,int v,int op,int minn,int q)
    {
    if(!x)
        {
        if(op&1){a[pre].ls=cnt;a[cnt].v=v;}
        else {a[pre].rs=cnt;a[cnt].v=v;}
        return min(minn,abs(a[pre].v-v));
        }
    minn=min(minn,abs(v-a[x].v));
    if(v<a[x].v)
        {
        if(pre==0 && q==0)l++;
        return ins(x,a[x].ls,v,1,minn,1);
        }
    else 
        {
        if(pre==0 && q==0)r++;
        return ins(x,a[x].rs,v,2,minn,1);
        }
    }
void rebuild()
    {
    int pcnt=cnt;cnt=1;
    int pn=pcnt>>1;
    for(int i=1;i<=pcnt;i++)a[i].ls=a[i].rs=a[i].v=0;
    a[1].v=z[pn];
    for(int i=1;i<pn;i++)
        {
        cnt++;
        ins(0,1,z[i],0,2e9,1);
        }
    for(int i=pn+1;i<=pcnt;i++)
        {
        cnt++;
        ins(0,1,z[i],0,2e9,1);
        }
    cnt=pcnt;int q=(l+r)>>1;l=q;r=q;
    if((l+r)&1)r++;
    }
signed main()
    {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
	for(int i=1;i<=n;i++)z[i]=read();
    for(int i=1;i<=n;i++)
        {
        int x=z[i];cnt++;
        if(i==1){a[i].v=x;ans+=x;}
        else ans+=ins(0,1,x,0,2e9,0);	
        if(l>=0.9*cnt||r>=0.9*cnt)rebuild();
        }
    cout<<ans;
    return 0;
    }
/*
10
1 1 2 3 4 5 3 4 1 3
*/
2024/7/12 14:38
加载中...