This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pii;
typedef long double ld;
typedef pair<ld,ld> pdd;
#define pb push_back
#define fr first
#define sec second
#define mp make_pair
ll n,r,m,inf=99999999999;
vector<pii> swp;
pair<int,pdd> crosspoints(ll xf, ll yf, ll xs, ll ys){
ld k=(double)(yf-ys)/(xf-xs);
//cout<<k<<endl;
ld a=yf-k*xf;
ld D=4*a*a*k*k-4*(a*a-r*r)*(1+k*k);
//cout<<D<<endl;
pair<int,pdd> ret;
if(D<0){ ret.fr=0;} //nema
else if(D==0){ ret.fr=1; //samo jed
ld x1=(-2*a*k)/(2*(1+k*k));
ret.sec.fr=x1;
//cout<<x1<<endl;
}
else{ret.fr=2; //ima
ld x1=(-2*a*k-sqrt(D))/(2*(1+k*k));
ld x2=(-2*a*k+sqrt(D))/(2*(1+k*k));
ret.sec.fr=x1; ret.sec.sec=x2;
//cout<<x1<<" "<<x2<<endl;
}
return ret;
}
bool inkruz(ll x, ld y){
if(x<-r || x>r || y<-r || y>r) return false;
ld ky=sqrt(r*r-x*x);
if(abs(ky-y)<=0.000000001){return true;}
if(ky<=0 && y<ky){return false;}
if(ky>=0 && y>ky){return false;}
return true;
}
int main(){
cin >> n >> r;
for(int i=0;i<n;i++){
ll xf,yf,xs,ys; cin >> xf>>yf>>xs>>ys;
//poseban slucaj -> xf==xs
if(xf==xs){swap(xf,yf); swap(xs,ys);}
//
pair<int,pdd> cp=crosspoints(xf,yf,xs,ys);
int lef=0; if(xf>xs){lef=1;}
ll pomx=abs(xs-xf);
if(cp.fr==0){continue;}
if(cp.fr==1){
ld x1=cp.sec.fr;
if(ceil(x1)!=floor(x1)){continue;}
if(lef && xf<x1){continue;}
if(!lef && xf>x1){continue;}
ll dif=abs(x1-xf);
if(dif%pomx!=0){continue;}
ll num=dif/pomx;
//cout<<"moz "<<num<<" do "<<num<<endl;
swp.pb(mp(num,0)); swp.pb(mp(num,1));
}
if(cp.fr==2){
ld xx1=cp.sec.fr,xx2=cp.sec.sec;
ll x1=ceil(xx1),x2=floor(xx2);
ld k=(double)(yf-ys)/(xf-xs);
ld y1=k*x1+yf-k*xf,y2=k*x2+yf-k*xf;
if(!inkruz(x1,y1) || !inkruz(x2,y2)){continue;}
//sig unutar kruga
//x1
if(lef && xf<x1){continue;}
if(!lef && xf>x1){continue;}
ll dif=abs(x1-xf);
ll num1=dif/pomx;
if(num1*pomx!=dif){num1++;
//provjera jel jos u kruznici
ll nx=xf+num1*pomx;
ld ny=k*nx+yf-k*xf;
if(!inkruz(nx,ny)){continue;}
}
//x2
if(lef && xf<x2){continue;}
if(!lef && xf>x2){continue;}
dif=abs(x2-xf);
ll num2=dif/pomx;
if(num2<num1){swap(num1,num2);}
//cout<<"moz "<<num1<<" do "<<num2<<endl;
swp.pb(mp(num1,0)); swp.pb(mp(num2,1));
}
}
sort(swp.begin(),swp.end());
ll mx=0,op=0;
for(int i=0;i<(int)swp.size();i++){
if(swp[i].sec){op--;}
else{op++;}
mx=max(mx,op);
}
cout<<mx;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |