B题Bonuses on a Line
思路:四种情况:只往左走,只往右走,先向右走再向左走,先向左走再向右走。枚举每种情况的最大值,还要判断0处是否有,如果有最大值+1,如果没有,输出最大值
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll pos[N];
ll neg[N];
ll p1=0;
ll p2=0;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll n,t;
cin>>n>>t;
ll flag=0;
for(int i=1;i<=n;i++)
{
ll x;
cin>>x;
if(x<0)
neg[++p1]=-x;
else if(x>0)
pos[++p2]=x;
else
flag=1;
}
sort(neg+1,neg+1+p1);
ll ans=0;
ll cur=0;
for(int i=1;i<=p1;i++)
{
if(neg[i]>t)
break;
cur++;
}
ans=max(ans,cur);
cur=0;
for(int i=1;i<=p2;i++)
{
if(pos[i]>t)
break;
cur++;
}
ans=max(ans,cur);
for(int i=1;i<=p1;i++)
{
ll left=t-neg[i]*2;
if(left<0)
break;
ll idx=upper_bound(pos+1,pos+1+p2,left)-pos;
idx--;
cur=idx+i;
ans=max(cur,ans);
}
for(int i=1;i<=p2;i++)
{
ll left=t-pos[i]*2;
if(left<0)
break;
ll idx=upper_bound(neg+1,neg+1+p1,left)-neg;
idx--;
cur=idx+i;
ans=max(cur,ans);
}
cout<<ans+flag<<endl;
return 0;
}