1 条题解

  • 1
    @ 2024-12-30 13:16:06
    #include<bits/stdc++.h>
    using namespace std;
    long long t,n,num[50010],st,l,r,mid,maxx;
    int check(long long x,long long y)//左和右
    {
        long long tot=abs(num[y]);
        if(tot<=t&&tot*2>=t)
        {
            if(y-st+1>maxx)
            {
                maxx=y-st+1;
                return 1;
            }
            else
            {
                return 1;
            }
        }
        else
        {
            if(tot*2<t)
            {
                if(tot+abs(num[x]-num[y])<=t)
                {
                	if(y-x+1>maxx)
                	{
                		maxx=y-x+1;
                		return 1;
                	}
                	else
                	{
                		return 1;
                	}
                }
                else
                {
                	return 0;
                }
            }
            else
            {
                if(tot>t)
                {
                    return 0;
                }			
            }
        }
    }
    int main()
    {
        scanf("%lld%lld",&t,&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&num[i]);
        }
        sort(num+1,num+n+1);
        for(int i=1;i<=n;i++)
        {
            if(num[i]>=0)
            {
                st=i;//st是start,即第一个正数
                break;
            }
        }
        for(int i=1;i<=st;i++)//st为零时直接跳过,倒转再求一次,显然此时必不为零
        {
            l=i;//避免check内乱套,l从i开始
            r=n;
            for(;l<=r;)
            {
                mid=(l+r)/2;
                if(check(i,mid))
                {
                    l=mid+1;
                }
                else
                {
                    r=mid-1;
                }
            }
            check(i,r);
        }
        for(int i=1;i<=n;i++)
        {
        	num[i]*=-1;
        }
        sort(num+1,num+n+1);
        for(int i=1;i<=n;i++)
        {
            if(num[i]>=0)
            {
                st=i;
                break;
            }
        }
        for(int i=1;i<=st;i++)
        {
            l=i;
            r=n;
            for(;l<=r;)
            {
                mid=(l+r)/2;
                if(check(i,mid))
                {
                    l=mid+1;
                }
                else
                {
                    r=mid-1;
                }
            }
            check(i,r);
        }
        cout<<maxx;
    }
    

    信息

    ID
    6428
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    15
    已通过
    12
    上传者