#include<cstdio>
#include<cstdlib>
const int maxn=100003;
int n,l;
int t[maxn],s[maxn];
long long int f[maxn],max;
int min(int a,int b)
{
return a<b?a:b;
}
void swap(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
}
void sort(int l,int r)
{
int key=t[rand()%(r-l+1)+l];
int i=l,j=r;
while(i<=j)
{
while(t[i]<key)
i++;
while(t[j]>key)
j--;
if(i<=j)
{
swap(&t[i],&t[j]);
swap(&s[i],&s[j]);
i++;
j--;
}
}
if(l<j)
sort(l,j);
if(i<r)
sort(i,r);
}
int main()
{
srand(909978797);
freopen("bobsled.in","r",stdin);
freopen("bobsled.out","w",stdout);
scanf("%d%d",&l,&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&t[i],&s[i]);
}
sort(1,n);
s[0]=1;
t[0]=0;
for(int i=n;i>=1;i--)
{
if(s[i-1]-s[i]>=t[i]-t[i-1])
s[i-1]=s[i]+t[i]-t[i-1];
}
s[n+1]=s[n]+l-t[n];
f[0]=s[0];
t[n+1]=l;
for(int i=1;i<=n+1;i++)
{
int start_speed=min(f[i-1],s[i-1]);
int delta_speed=start_speed-s[i];
int distance=t[i]-t[i-1];
int tmp=distance-abs(delta_speed);
if(tmp<0)
{
f[i]=long long int(start_speed)+long long int(distance);
}
else
{
f[i]=long long int(tmp/2)+long long int(s[i]>start_speed?s[i]:start_speed);
}
}
for(int i=0;i<=n+1;i++)
{
max=max>f[i]?max:f[i];
}
printf("%lld\n",max);
fclose(stdin);
fclose(stdout);
return 0;
}
USACO 2009 Dec Bobsledding 滑雪比赛
最新推荐文章于 2022-02-19 11:33:22 发布