Submission #44808

#TimeUsernameProblemLanguageResultExecution timeMemory
44808leehosu01먼 별 (KOI16_dist)C++17
0 / 100
57 ms1636 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; #define F(X) (X<0?-1:X>0) ll T,MT,N,tms,bst=1ll<<62ll; struct A{ int x,y,dx,dy;void SC(){cin>>x>>y>>dx>>dy;} ll lcx(){return T*dx+x;} ll lcy(){return T*dy+y;} bool operator<(const A&X)const{return T*dx+x==T*X.dx+X.x?T*dy+y<T*X.dy+X.y:T*dx+x<T*X.dx+X.x;} ll Ds(A&X){return (lcx()-X.lcx())*(lcx()-X.lcx())+(lcy()-X.lcy())*(lcy()-X.lcy());} }S[30000]; int cp(ll*X,ll*Y) { ll T=0; for(int i=0;i<3;i++) T+=X[i]*Y[i+1]-X[i+1]*Y[i]; return F(T); } int ccw(A&x0,A&x1,A&x2) { A XA[4]={x0,x1,x2,x0}; ll XX[4],YY[4]; for(int i=0;i<4;i++) { XX[i]=XA[i].lcx(); YY[i]=XA[i].lcy(); } return cp(XX,YY); } bool used[30000]; #define nxt(X,Xp) Xp=X;if(++Xp==cov.end())Xp=cov.begin() inline ld slop(A&d1,A&d2) { return ((ld)d1.lcx()-d2.lcx())/(d1.lcy()-d2.lcy()); } const ld RAD=180/(ld)3.14159265358979646323; inline ld slopRNG(ld x1,ld x2,ld x3)//각도상[0]<=[1]<=[2]에서 1반환 { ld AT[3],SP[3]={x1,x2,x3}; for(int i=0;i<3;i++)AT[i]=atan(SP[i]); return (AT[0]<=AT[1]&&AT[1]<=AT[2]); } ll pro(int Ts) { memset(used,0,sizeof(used)); list<int>::iterator s1,s2; list<int>cov; T=Ts; sort(S,S+N); int K=1; for(int i=0;i>=0;i+=K) { if(i==N)K=-1,s1=cov.begin(),s2=--cov.end(); if(i!=0&&used[i])continue; while(cov.size()>=2&&ccw(S[--cov.back()],S[cov.back()],S[i])==1){used[cov.back()]=0;cov.pop_back();} used[i]=1;cov.push_back(i); }//시작정점은 2번들어간다. ll MX=0; /*list<int>::iterator I,Ip,J=cov.begin(),Jp,Jpp; for(I=cov.begin();I!=cov.end();I++) { nxt(I,Ip); ld SPI=slop(S[*I],S[*Ip]); nxt(J,Jp); nxt(Jp,Jpp); while(!slopRNG(slop(S[*J],S[*Jp]),SPI,slop(S[*Jp],S[*Jpp]))){J=Jp;Jp=Jpp;nxt(Jp,Jpp);printf("c");} MX=max(MX,S[*I].Ds(S[*Jp])); printf("A"); } printf("B"); */ list<int>::iterator I=s1,It,J=s2,Jt; do{ It=I;++It; Jt=J;++Jt; if(Jt==cov.end())break; MX=max(MX,S[*I].Ds(S[*J])); MX=max(MX,S[*I].Ds(S[*Jt])); MX=max(MX,S[*It].Ds(S[*J])); MX=max(MX,S[*It].Ds(S[*Jt])); if(slop(S[*I],S[*It])<slop(S[*J],S[*Jt]))++I; else ++J; }while(I!=s2&&J!=cov.end()); if(MX<bst)bst=MX,tms=Ts; return MX; } void rnd(ll&X) { ull T=rand(); for(int i=0;i<=10;i++)T^=((ull)rand()<<(rand()%64)); X=(T>>1)%(MT+1); } int main() { /*while(1) { ll X[4],Y[4]; cin>>X[0]>>X[1]>>X[2]; cin>>Y[0]>>Y[1]>>Y[2]; X[3]=X[0]; Y[3]=Y[0]; ll T=0; for(int i=0;i<3;i++) T+=X[i]*Y[i+1]-X[i+1]*Y[i]; printf("%d\n",F(T)); }*/ int i; cin>>N>>MT; for(i=0;i<N;i++)S[i].SC(); ll l=0,r=MT,m,PS[3],minl,minI; while(l<r) { m=l+r>>1; minl=1ll<<62ll; for(i=-1;i<2;i++) { if(m+i>=0&&m+i<=MT) { PS[i+1]=pro(m+i); if(PS[i+1]<minl) { minl=PS[i+1]; minI=i; } } } if(minI==-1)r=m-1; else if(minI==0)l=r=m; else l=m+1; } cout<<tms<<'\n'<<bst; }

Compilation message (stderr)

dist.cpp: In function 'int main()':
dist.cpp:121:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
         m=l+r>>1;
           ~^~
dist.cpp:135:9: warning: 'minI' may be used uninitialized in this function [-Wmaybe-uninitialized]
         if(minI==-1)r=m-1;
         ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...