85分求助
查看原帖
85分求助
1026499
hjc452666楼主2024/12/18 16:13

拍了一下午没拍出来555

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N=6000005;
int n,s,p[N],nx[N],f[N];
pii t[N<<2];
pii merge(pii a,pii b)
{
    pii c;
    if(a.fi==-1)return b;
    else if(b.fi==-1)return a;
    else if(!a.fi||!b.fi)c={0,0};
    else c={max(a.fi,b.fi),min(a.se,b.se)};
    if(c.fi>c.se)c.fi=c.se=0;
    return c;
}
void ins(int x,pii v,int p=1,int l=1,int r=2*n)
{
    if(l==r){t[p]=v;return;}
    int mid=l+r>>1;
    if(x<=mid)ins(x,v,p<<1,l,mid);
    else ins(x,v,p<<1|1,mid+1,r);
    t[p]=merge(t[p<<1],t[p<<1|1]);
}
pii qus(int L,int R,int p=1,int l=1,int r=2*n)
{
    if(L<=l&&r<=R)return t[p];
    int mid=l+r>>1;
    if(L<=mid&&R>mid)return merge(qus(L,R,p<<1,l,mid),qus(L,R,p<<1|1,mid+1,r));
    else if(L<=mid)return qus(L,R,p<<1,l,mid);
    else return qus(L,R,p<<1|1,mid+1,r);
}
int fd(int L,int s,pii &v,int p=1,int l=1,int r=2*n)
{
    if(L<=l)
    {
        pii c=merge(t[p],v);
        if(c.fi<=s&&s<=c.se){v=c;return 0;}
        if(l==r)return l;
        int mid=l+r>>1,res=0;
        res=fd(L,s,v,p<<1,l,mid);
        if(res)return res;
        return fd(L,s,v,p<<1|1,mid+1,r);
    }
    int mid=l+r>>1,res=0;
    if(L<=mid)res=fd(L,s,v,p<<1,l,mid);
    if(res)return res;
    return fd(L,s,v,p<<1|1,mid+1,r);
}
pii gt(int x,int y)
{
    int mid=x+y>>1;
    if(x>y)
    {
        return {1,mid+(x+y&1)-1};
    }
    else
    {
        return {mid+1,n};
    }
}
int main()
{
    // freopen("1.in","r",stdin);
    // freopen("1.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    cin>>n>>s;long long ans=0;
    nx[0]=1;f[2*n+1]=2*n;
    for(int i=1;i<=n;++i)
    {
        cin>>p[i];p[i+n]=p[i];f[i]=i-1;nx[i]=i+1;f[i+n]=i+n-1;nx[i+n]=i+n+1;
    }
    for(int i=1;i<2*n;++i)
    {
        ins(i,gt(p[i],p[i+1]));
    }
    ins(2*n,{-1,0});
    for(int i=1,pos=1;i<n;++i)
    {
        // int l=pos+1,r=pos+n;
        // while(l<r)
        // {
        //     int mid=l+r>>1;
        //     pii v=qus(pos,mid-1);
        //     if(v.fi<=s&&s<=v.se)l=mid+1;
        //     else r=mid;
        // }
        // l--;
        pii v={1,n};
        int l=fd(pos,s,v);
        if(l>n)l-=n;
        ans+=abs(s-p[l]);
        // cout<<l<<" "<<s<<" "<<p[l]<<" "<<ans<<"\n";
        s=p[l];
        ins(l,{-1,0}),ins(l+n,{-1,0});
        nx[f[l]]=nx[l];f[nx[l]]=f[l];
        nx[f[l+n]]=nx[l+n];f[nx[l+n]]=f[l+n];
        if(i==n-1)continue;
        if(f[l]&&nx[l])ins(f[l],gt(p[f[l]],p[nx[l]]));
        else if(f[l])ins(f[l],{-1,0});
        if(f[l+n]&&nx[l+n])ins(f[l+n],gt(p[f[l+n]],p[nx[l+n]]));
        else if(f[l+n])ins(f[l+n],{-1,0});
        pos=nx[l];if(pos>n)pos-=n;
    }
    ans+=abs(s-p[nx[0]]);
    cout<<ans;
    return 0;
}
2024/12/18 16:13
加载中...