Advertisement
a53

strips

a53
Mar 12th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.08 KB | None | 0 0
  1. //Em. Cerchez 100 puncte
  2. #include <fstream>
  3. #define NRMAX 50002
  4. using namespace std;
  5. ifstream fin("strips.in");
  6. ofstream fout("strips.out");
  7.  
  8. struct zona {int inc, sf;};
  9. zona Z[2][NRMAX]; //0 Ana 1 Bogdan
  10. int nrz[2];
  11.  
  12. int N, L, Nr, poz, C;
  13. int p[2], lgmax[2];
  14. int cautbinar(int poz);
  15. bool valid(int poz, int unde, int culoare);
  16. void plaseaza (int poz, int cine);
  17. int main()
  18. {int i, poz, j;
  19. fin>>C>>N>>Nr>>L;
  20. for (i=1; i<=Nr; i++)
  21. {
  22. fin>>poz;
  23. plaseaza(poz, 0);
  24. fin>>poz;
  25. plaseaza(poz, 1);
  26. }
  27. if (C==1) fout<<p[0]<<' '<<p[1]<<'\n';
  28. else
  29. {for (j=0; j<2; j++)
  30. for (i=1; i<=nrz[j]; i++)
  31. if (lgmax[j]<Z[j][i].sf-Z[j][i].inc+1)
  32. lgmax[j]=Z[j][i].sf-Z[j][i].inc+1;
  33. fout<<lgmax[0]<<' '<<lgmax[1]<<'\n';
  34. }
  35. fout.close();
  36. return 0;
  37. }
  38.  
  39. int cautbinar(int poz, int unde)
  40. ///invariant Z[unde][st].inc<poz<=Z[unde][dr].inc
  41. {int st=0, dr=nrz[unde]+1, mij;
  42. while (dr-st>1)
  43. {
  44. mij=(st+dr)/2;
  45. if (Z[unde][mij].inc>=poz) dr=mij;
  46. else st=mij;
  47. }
  48. return dr;
  49. }
  50.  
  51. void plaseaza (int poz, int cine)
  52. {int unde, adv, alipit,j;
  53. if (poz+L-1>=N) {p[cine]++; return;}
  54. adv=1-cine;
  55. unde=cautbinar(poz,adv);
  56. if (unde<=nrz[adv] && poz+L-1>=Z[adv][unde].inc-1) {p[cine]++; return;}
  57. if (unde>1 && poz<=Z[adv][unde-1].sf+1) {p[cine]++; return;}
  58. ///mutare valida
  59. unde=cautbinar(poz,cine);
  60. //alipire
  61. alipit=0;
  62. if (unde-1>0)
  63. if (poz<=Z[cine][unde-1].sf+1)
  64. {Z[cine][unde-1].sf=max(poz+L-1,Z[cine][unde-1].sf); alipit=1;}
  65.  
  66. if (unde<=nrz[cine])
  67. if (poz+L-1>=Z[cine][unde].inc-1)
  68. {Z[cine][unde].inc=min(poz,Z[cine][unde].inc); alipit=1;}
  69. //eliminare
  70. if (unde<=nrz[cine] && unde>1 && Z[cine][unde].inc<=Z[cine][unde-1].sf+1)
  71. {
  72. Z[cine][unde-1].sf=Z[cine][unde].sf;
  73. for (j=unde; j<nrz[cine]; j++) Z[cine][j]=Z[cine][j+1];
  74. nrz[cine]--;
  75. }
  76. if (!alipit) //inserare
  77. {
  78. for (j=nrz[cine]; j>=unde; j--) Z[cine][j+1]=Z[cine][j];
  79. nrz[cine]++;
  80. Z[cine][unde].inc=poz; Z[cine][unde].sf=poz+L-1;
  81. }
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement