Advertisement
MinhNGUYEN2k4

Untitled

Dec 2nd, 2021
788
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.58 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3.  
  4.  
  5. const int MAXM=100000;
  6.  
  7. int C,M;
  8.  
  9. int x[MAXM],l[MAXM];
  10.  
  11. int answer;
  12.  
  13. int right[MAXM];
  14.  
  15. int f[MAXM];
  16.  
  17.  
  18.  
  19. void quick_sort(int L,int R)
  20.  
  21. {
  22.  
  23.      int x_mid=x[(L+R)>>1];
  24.  
  25.      int l_mid=l[(L+R)>>1];
  26.  
  27.      int i=L,j=R;
  28.  
  29.      while (i<=j)
  30.  
  31.      {
  32.  
  33.            while ((x[i]<x_mid)||(x[i]==x_mid&&x[i]+l[i]>x_mid+l_mid)) i++;
  34.  
  35.            while ((x[j]>x_mid)||(x[j]==x_mid&&x[j]+l[j]<x_mid+l_mid)) j–;
  36.  
  37.            if (i<=j)
  38.  
  39.            {
  40.  
  41.               int swap;
  42.  
  43.               swap=x[i];
  44.  
  45.               x[i]=x[j];
  46.  
  47.               x[j]=swap;
  48.  
  49.               swap=l[i];
  50.  
  51.               l[i]=l[j];
  52.  
  53.               l[j]=swap;
  54.  
  55.               i++;
  56.  
  57.               j–;
  58.  
  59.            }
  60.  
  61.      }
  62.  
  63.      if (L<j) quick_sort(L,j);
  64.  
  65.      if (i<R) quick_sort(i,R);
  66.  
  67. }
  68.  
  69.  
  70.  
  71. int main()
  72.  
  73. {
  74.  
  75.     freopen(“corral.in,“r”,stdin);
  76.  
  77.     freopen(“corral.out,“w”,stdout);
  78.  
  79.     scanf(%d %d\n”,&C,&M);
  80.  
  81.     for (int i=0;i<M;i++)
  82.  
  83.         scanf(%d %d\n”,&x[i],&l[i]);
  84.  
  85.    
  86.  
  87.     quick_sort(0,M-1);
  88.  
  89.    
  90.  
  91.     for (int i=0,j=0;j<M;)
  92.  
  93.     {
  94.  
  95.         x[i]=x[j];
  96.  
  97.         l[i]=l[j];
  98.  
  99.         j++;
  100.  
  101.         while ((x[i]+l[i]>=x[j]+l[j])&&(j<M)) j++;
  102.  
  103.         i++;
  104.  
  105.         if (j>=M) M=i;
  106.  
  107.     }
  108.  
  109.    
  110.  
  111.     //for (int i=0;i<M;i++)
  112.  
  113.     //    printf(“%d %d\n”,x[i],x[i]+l[i]);
  114.  
  115.    
  116.  
  117.     for (int i=M-1,j=M-1;i>=0;i–)
  118.  
  119.     {
  120.  
  121.         while ((x[j]>x[i]+l[i])&&(j>=0)) j–;
  122.  
  123.         right[i]=j;
  124.  
  125.     }
  126.  
  127.    
  128.  
  129.     answer=MAXM;
  130.  
  131.     for (int begin=M-1;;begin–)
  132.  
  133.     {
  134.  
  135.         if (x[begin]+l[begin]<C) break;
  136.  
  137.         int X=x[begin]+l[begin]-C;
  138.  
  139.         int L=x[begin]-X;
  140.  
  141.         if (L<=0)
  142.  
  143.         {
  144.  
  145.            answer=1;
  146.  
  147.            break;
  148.  
  149.         }
  150.  
  151.        
  152.  
  153.         //printf(“begin:%d\n”,begin);
  154.  
  155.         //printf(“X=%d X+L=%d\n”,X,X+L);
  156.  
  157.         f[begin]=1;
  158.  
  159.         for (int i=begin-1,j=begin;i>=0;i–)
  160.  
  161.         {
  162.  
  163.             //while (x[j]>x[i]+l[i]) j–;
  164.  
  165.             //printf(“i%d j%d\n”,i,j);
  166.  
  167.             f[i]=f[right[i]]+1;
  168.  
  169.             //f[i]=f[j];
  170.  
  171.             //for (int k=j;k>i;k–)
  172.  
  173.             //    if (f[i]>f[k])
  174.  
  175.             //       f[i]=f[k];
  176.  
  177.             //f[i]++;
  178.  
  179.            
  180.  
  181.             if (x[i]<=X)
  182.  
  183.             {
  184.  
  185.                if (answer>f[i]) answer=f[i];
  186.  
  187.                //printf(“begin:%d f[%d]=%d\n”,begin,i,f[i]);
  188.  
  189.                break;
  190.  
  191.             }
  192.  
  193.         }
  194.  
  195.     }
  196.  
  197.    
  198.  
  199.     printf(%d\n”,answer);
  200.  
  201.    
  202.  
  203.     fclose(stdin);
  204.  
  205.     fclose(stdout);
  206.  
  207.     return 0;
  208.  
  209. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement