Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- const int MAXM=100000;
- int C,M;
- int x[MAXM],l[MAXM];
- int answer;
- int right[MAXM];
- int f[MAXM];
- void quick_sort(int L,int R)
- {
- int x_mid=x[(L+R)>>1];
- int l_mid=l[(L+R)>>1];
- int i=L,j=R;
- while (i<=j)
- {
- while ((x[i]<x_mid)||(x[i]==x_mid&&x[i]+l[i]>x_mid+l_mid)) i++;
- while ((x[j]>x_mid)||(x[j]==x_mid&&x[j]+l[j]<x_mid+l_mid)) j–;
- if (i<=j)
- {
- int swap;
- swap=x[i];
- x[i]=x[j];
- x[j]=swap;
- swap=l[i];
- l[i]=l[j];
- l[j]=swap;
- i++;
- j–;
- }
- }
- if (L<j) quick_sort(L,j);
- if (i<R) quick_sort(i,R);
- }
- int main()
- {
- freopen(“corral.in”,“r”,stdin);
- freopen(“corral.out”,“w”,stdout);
- scanf(“%d %d\n”,&C,&M);
- for (int i=0;i<M;i++)
- scanf(“%d %d\n”,&x[i],&l[i]);
- quick_sort(0,M-1);
- for (int i=0,j=0;j<M;)
- {
- x[i]=x[j];
- l[i]=l[j];
- j++;
- while ((x[i]+l[i]>=x[j]+l[j])&&(j<M)) j++;
- i++;
- if (j>=M) M=i;
- }
- //for (int i=0;i<M;i++)
- // printf(“%d %d\n”,x[i],x[i]+l[i]);
- for (int i=M-1,j=M-1;i>=0;i–)
- {
- while ((x[j]>x[i]+l[i])&&(j>=0)) j–;
- right[i]=j;
- }
- answer=MAXM;
- for (int begin=M-1;;begin–)
- {
- if (x[begin]+l[begin]<C) break;
- int X=x[begin]+l[begin]-C;
- int L=x[begin]-X;
- if (L<=0)
- {
- answer=1;
- break;
- }
- //printf(“begin:%d\n”,begin);
- //printf(“X=%d X+L=%d\n”,X,X+L);
- f[begin]=1;
- for (int i=begin-1,j=begin;i>=0;i–)
- {
- //while (x[j]>x[i]+l[i]) j–;
- //printf(“i%d j%d\n”,i,j);
- f[i]=f[right[i]]+1;
- //f[i]=f[j];
- //for (int k=j;k>i;k–)
- // if (f[i]>f[k])
- // f[i]=f[k];
- //f[i]++;
- if (x[i]<=X)
- {
- if (answer>f[i]) answer=f[i];
- //printf(“begin:%d f[%d]=%d\n”,begin,i,f[i]);
- break;
- }
- }
- }
- printf(“%d\n”,answer);
- fclose(stdin);
- fclose(stdout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement