Advertisement
a53

masterpiece002_CU_MEMORIE_REDUSA

a53
Mar 13th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cmath>
  4. #define Dmax 505050
  5. using namespace std;
  6. float T[Dmax]; /// Ar mai fi o solutie, sa-l impart si pe acesta in 2
  7. /// Sa pun partea intreaga intrun short int si partea zecimala in alt short int
  8. /// As reduce memoria pentru T la jumatate. Dar trebuie sa fac si o functie pentru comparare
  9. /// Cred ca asta e. Se reduce memoria la sub 2,5M. Doar ultimul test consuma foarte multa memorie
  10. unsigned short readInt() /// Citirea numerelor intregi prin parsare
  11. {
  12. bool semn=false;
  13. unsigned short raspuns=0;
  14. char c;
  15. while(true)
  16. {
  17. c=getchar();
  18. if(c==EOF)
  19. return 1001;
  20. if(c=='-')
  21. {
  22. semn=true;
  23. break;
  24. }
  25. if(c>='0'&&c<='9')
  26. {
  27. raspuns=c-'0';
  28. break;
  29. }
  30. }
  31. while(true)
  32. {
  33. c=getchar();
  34. if(c<'0'||c>'9')
  35. break;
  36. raspuns=10*raspuns+c-'0';
  37. }
  38. if(semn)
  39. return -raspuns;
  40. return raspuns;
  41. }
  42.  
  43. int main()
  44. {
  45. int n=0; /// n=nr de segmente simple
  46. unsigned short X1,Y1,X2,Y2,a,b,r;
  47. bool SF_FIS=false;
  48. freopen("masterpiece002.in", "r",stdin);
  49. while(!SF_FIS)
  50. {
  51. X1=readInt();
  52. if(X1==1001)
  53. {
  54. SF_FIS=true;
  55. break;
  56. }
  57. Y1=readInt();X2=readInt();Y2=readInt();
  58. a=abs(X2-X1),b=abs(Y2-Y1); /// a=latura orizontala si b=latura verticala ale triunghiului
  59. if(b!=0)
  60. do /// Calculam CMMDC(a,b)
  61. {
  62. r=a%b;
  63. a=b;
  64. b=r;
  65. }
  66. while(r); /// in final a va fi cel mai mare divizor comun
  67. else
  68. if(a==0) /// pentru a prinde cazul particular in care ambele valori sunt 0
  69. a=1;
  70. /// (Y1==Y2&&abs(X2-X1)==1) <=> Segment orizontal de lungime 1
  71. /// (X1==X2&&abs(Y2-Y1)==1) <=> Segment vertical de lungime 1
  72. /// (X2==X1&&Y2==Y1&&abs(Y1-X1)==1) <=> Segment oblic de lungime 1
  73. if(a==1||(Y1==Y2&&abs(X2-X1)==1)||(X1==X2&&abs(Y2-Y1)==1)||(X2==X1&&Y2==Y1&&abs(Y1-X1)==1)) /// Daca e segment simplu,
  74. T[n++]=sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)); /// calculam distanta si o memoram
  75. }
  76. int mij,st,dr,Lmax=0;
  77. short int M_2[n]; /// M_2 este M fara ultimele 2 cifre
  78. char M2[n]; /// M2 este M cu ultimele doua cifre
  79. for(int i=0;i<n;++i)
  80. {
  81. st=1;
  82. dr=Lmax;
  83. while(st<=dr) /// Cautare binara
  84. {
  85. mij=(st+dr)/2;
  86. int mij_c=M_2[mij]*100+M2[mij]; /// Valoarea lui M[mij]
  87. if(T[mij_c]<=T[i])
  88. st=mij+1;
  89. else
  90. dr=mij-1;
  91. }
  92. if(st>Lmax)
  93. Lmax=st;
  94. M_2[st]=i/100;M2[st]=i%100; /// pun pe i in cei doi vectori
  95. }
  96. freopen ("masterpiece002.out","w",stdout);
  97. cout<<Lmax<<'\n';
  98. return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement