求调
查看原帖
求调
316801
YukinoYukinoshita楼主2023/6/10 11:26

WA15,调不出来紫砂了

#include<bits/stdc++.h>
using namespace std;
long long Abs(int x)
{
    return x>0?x:-x;
}
const int MAXN=2e6+5;
int n;
long long B;
long long b[MAXN];
long long L,R;
deque<pair<long long,int>>S;
int op;
long long deta=0;
long long Rs[MAXN];
long long D[MAXN];
int Ox[MAXN];
long long Dl[MAXN];
long long Dr[MAXN];
pair<long long,int> Ds[MAXN];
pair<long long,int> Dx[MAXN];
long long Res[MAXN];
int main()
{

    // freopen("date.in","r",stdin);
    // freopen("date.out","w",stdout);
    scanf("%d %lld",&n,&B);
    for(int i=3;i<=n;i++)
    {
        scanf("%lld",&b[i]);
    }
    L=0;
    R=b[3];
    S.clear();
    op=1;
    deta=0;
    Ox[2]=1;
    D[2]=0;
    for(int i=3;i<=n;i++)
    {
        long long B=(b[i]-deta)*op;
        bool found=0;
        bool F=0;
        
        if(op==1)
        {
            while(S.size()&&S.back().first>B)
            {
                S.pop_back();
            }
            if(S.size()&&S.back().first==B)
            {
                found=1;
                Dx[i]=S.back();
            }
            R=min(R,B);
            if(B>=L&&B<=R)
            {
                found=1;
            }
        }
        else
        {
            while(S.size()&&S.front().first<B)
            {
                S.pop_front();
            }
            if(S.size()&&S.front().first==B)
            {
                found=1;
                Dx[i]=S.front();
            }
            L=max(L,B);
            if(B>=L&&B<=R)
            {
                found=1;
            }
            
        }
        
        if((S.size()||(L<=R)))
        {
            F=1;
        }
        Dl[i]=L;
        Dr[i]=R;
        op*=-1;
        deta*=-1;
        deta+=b[i];
        if(S.size())
        {
            Ds[i]=S.front();
        }
        else
        {
            Ds[i]=make_pair(-1,-1);
        }
        if(found)
        {
            if(op==1)
            {
                long long Txl=(0-deta)*op;
                long long Txr=(b[i]-deta)*op;
                L=min(L,Txl);
                R=max(R,Txr);
            }
            else
            {
                long long Txr=(0-deta)*op;
                long long Txl=(b[i]-deta)*op;
                L=min(L,Txl);
                R=max(R,Txr);
            }
        }
        if(F)
        {
            if(op==1)
            {
                S.push_back(make_pair((b[i]-deta)*op,i));
            }
            else
            {
                S.push_front(make_pair((b[i]-deta)*op,i));
            }
            
        }
        D[i]=deta;
        Ox[i]=op;    
    }
    if(L<=R||(S.size()))
    {
        printf("YES\n");
        pair<long long,int>Rx;
        if(L<=R)
        {
            Rx.first=L;
            Rx.second=-1;
        }
        else
        {
            Rx=S.front();
        }
        int OO=1;
        for(int i=n;i>=2;i--)
        {
            Rs[i]=((Rx.first*Ox[i])+D[i])*OO;
            if(i==2)
            {
                break;
            }
            if(Rx.second==-1)
            {  
                long long Rl=Dl[i];
                long long Rr=Dr[i];
                long long B=(b[i]-D[i-1])*Ox[i-1];
                if(Rx.first>=Rl&&Rx.first<=Rr)
                {

                }
                else
                {
                    if(Rl<=B&&B<=Rr)
                    {
                        Rx.first=B;
                        Rx.second=-1;
                    }
                    else
                    {
                        Rx=Dx[i];
                    }
                    OO*=-1;
                    
                }

            }
            else if(Rx.second==i)
            {
                if(Ds[i].first!=-1)
                {
                    Rx=Ds[i];
                }
                else
                {
                    Rx.first=Dl[i];
                    Rx.second=-1;
                }
                OO*=-1;
            }
            
        }
        Res[1]=0;
        long long Now=0;
        for(int i=2;i<=n;i++)
        {
            Now+=Rs[i];
            Res[i]=Now;
        }
        long long Mini=0;
        for(int i=1;i<=n;i++){
            Mini=min(Mini,Res[i]);
        }
        for(int i=1;i<=n;i++)
        {
            printf("%lld ",Res[i]-Mini);
        }
    }
    else
    {
        printf("NO\n");
    }

}
2023/6/10 11:26
加载中...