Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <cmath>
- #define Dmax 505550
- using namespace std;
- int n,X1,Y1,X2,Y2,vf,Max,a,b,r,st,dr,mij,poz;
- float T[Dmax],s[Dmax];
- int main()
- {
- ifstream f("masterpiece002.in");
- ofstream g("masterpiece002.out");
- while(f>>X1>>Y1>>X2>>Y2)
- {
- a=abs(X2-X1),b=abs(Y2-Y1);
- if(b!=0)
- do
- {
- r=a%b;
- a=b;
- b=r;
- }
- while(r); /// in final a va fi cel mai mare divizor comun
- else
- if(a==0) /// pentru a prinde cazul particular in care ambele valori sunt 0
- a=-1;
- 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,
- T[n++]=sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)),g<<"n= "<<n<<' '<<X1<<' '<<Y1<<' '<<X2<<' '<<Y2<<' '<<endl; /// calculam distanta si o memoram
- }
- f.close();
- for(int i=1;i<=n;++i)
- {
- int st=1,dr=vf,mij,poz=0; /// Cautare binara
- while(st<=dr)
- {
- mij=(st+dr)/2;
- if(s[mij]<T[i])
- st=mij+1;
- else
- if(s[mij]>T[i])
- dr=mij-1,poz=mij;
- else
- {
- poz=mij;
- break;
- }
- }
- if(poz==0)
- ++vf,s[vf]=T[i],poz=vf;
- else
- s[poz]=T[i];
- if(poz>Max)
- Max=poz;
- }
- ///ofstream g("masterpiece002.out");
- g<<Max<<'\n';
- for(int i=1;i<=n;++i)
- g<<T[i]<<' ';
- g<<endl;
- g.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement