Advertisement
a53

masterpiece002

a53
Mar 8th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cmath>
  4. #define Dmax 505050
  5. using namespace std;
  6.  
  7. unsigned short readInt() /// Citirea numerelor intregi prin parsare
  8. {
  9. bool minus=false;
  10. unsigned short raspuns=0;
  11. char c;
  12. while(true)
  13. {
  14. c=getchar();
  15. if(c==EOF)
  16. return 1001;
  17. if(c=='-')
  18. {
  19. minus=true;
  20. break;
  21. }
  22. if(c>='0'&&c<='9')
  23. {
  24. raspuns=c-'0';
  25. break;
  26. }
  27. }
  28. while(true)
  29. {
  30. c=getchar();
  31. if(c<'0'||c>'9')
  32. break;
  33. raspuns=10*raspuns+c-'0';
  34. }
  35. if(minus)
  36. return -raspuns;
  37. return raspuns;
  38. }
  39.  
  40. int main()
  41. {
  42. float T[Dmax];
  43. int n=0; /// n=nr de segmente simple
  44. unsigned short X1,Y1,X2,Y2,a,b,r;
  45. freopen("masterpiece002.in", "r",stdin);
  46. bool SF_FIS=false;
  47. while(!SF_FIS)
  48. {
  49. X1=readInt();
  50. if(X1==1001)
  51. {
  52. SF_FIS=true;
  53. break;
  54. }
  55. Y1=readInt();X2=readInt();Y2=readInt();
  56. a=abs(X2-X1),b=abs(Y2-Y1); /// a=latura orizontala si b=latura verticala ale triunghiului
  57. if(b!=0)
  58. do /// Calculam CMMDC(a,b)
  59. {
  60. r=a%b;
  61. a=b;
  62. b=r;
  63. }
  64. while(r); /// in final a va fi cel mai mare divizor comun
  65. else
  66. if(a==0) /// pentru a prinde cazul particular in care ambele valori sunt 0
  67. a=1;
  68. /// (Y1==Y2&&abs(X2-X1)==1) <=> Segment orizontal de lungime 1
  69. /// (X1==X2&&abs(Y2-Y1)==1) <=> Segment vertical de lungime 1
  70. /// (X2==X1&&Y2==Y1&&abs(Y1-X1)==1) <=> Segment oblic de lungime 1
  71. 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,
  72. T[n++]=sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)); /// calculam distanta si o memoram
  73. }
  74. int mij,st,dr,Lmax=0,M[n];
  75. for(int i=0;i<n;++i)
  76. {
  77. st=1;
  78. dr=Lmax;
  79. while(st<=dr) /// Cautare binara
  80. {
  81. mij=(st+dr)/2;
  82. if(T[M[mij]]<=T[i])
  83. st=mij+1;
  84. else
  85. dr=mij-1;
  86. }
  87. M[st]=i;
  88. if(st>Lmax)
  89. Lmax=st;
  90. }
  91. freopen ("masterpiece002.out","w",stdout);
  92. cout<<Lmax<<'\n';
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement