제출 #56969

#제출 시각아이디문제언어결과실행 시간메모리
56969dennisstar먼 별 (KOI16_dist)C++11
0 / 100
449 ms1256 KiB
#include <bits/stdc++.h> #define round(x) (int)(x+0.5) typedef long long LL; int N, T; int anst; LL mxd=((1ll<<62)-1)*2+1; int stk[60010]; struct data { int x, y, dx, dy; int tx, ty; bool operator <(const data &r)const {return tx==r.tx?ty<r.ty:tx<r.tx;} }st[30010]; int cw(data a, data b, data c) { LL ii=(LL)(b.x-a.x)*(c.y-a.y)-(LL)(c.x-a.x)*(b.y-a.y); return ii>0?1:ii==0?0:-1; } int cw(data a, data b, data c, data d) { LL ii=(LL)(d.y-c.y)*(b.x-a.x)-(LL)(b.y-a.y)*(d.x-c.x); return ii>0?1:ii==0?0:-1; } long long dist(data a, data b) { LL x=(LL)a.tx-b.tx, y=(LL)a.ty-b.ty; return x*x+y*y; } long long rtc(int T) { int i, j; for (i=0; i<N; i++) st[i].tx=st[i].x+T*st[i].dx, st[i].ty=st[i].y+T*st[i].dy; std::sort(st, st+N); int t0=1, t1; stk[0]=0; long long mx=0; for (i=1; i<N; i++) { while(t0>1&&cw(st[stk[t0-2]], st[stk[t0-1]], st[i])<=0) t0--; stk[t0++]=i; } t1=t0; for (i=N-1; i>=0; i--) { while(t1>t0&&cw(st[stk[t1-2]], st[stk[t1-1]], st[i])<=0) t1--; stk[t1++]=i; } t1--; int ii=0; j=t0-1; //여기부터 int xx1, yy1, xx2, yy2; LL cos1, cos2; int x1, x2, y1, y2; x1=x2=0, y1=-1, y2=1; for (i=0; i<t1; i++) { mx=std::max(mx, dist(st[stk[ii]],st[stk[j]])); xx1=st[stk[(ii+1)%t1]].tx-st[stk[ii]].tx, xx2=st[stk[(j+1)%t1]].tx-st[stk[j]].tx; yy1=st[stk[(ii+1)%t1]].ty-st[stk[ii]].ty, yy2=st[stk[(j+1)%t1]].ty-st[stk[j]].ty; cos1=((LL)x1*xx1+(LL)y1*yy1)*((LL)x1*xx1+(LL)y1*yy1)*((LL)x2*x2+(LL)y2*y2)*((LL)xx2*xx2+(LL)yy2*yy2); cos2=((LL)x2*xx2+(LL)y2*yy2)*((LL)x2*xx2+(LL)y2*yy2)*((LL)x1*x1+(LL)y1*y1)*((LL)xx1*xx1+(LL)yy1*yy1); if(cos1>cos2) { ii=(ii+1)%t1; x1=xx1,y1=yy1; x2=-x1,y2=-y1; } else { j=(j+1)%t1; x2=xx2,y2=yy2; x1=-x2,y1=-y2; } } //여기까지 return mx; } void TriS() { int st=0, re=T; int x1, x2; long long d1, d2; for(int i=0; i<100; i++) { x1=round(((double)st*2+(double)re)/3); x2=round(((double)st+(double)re*2)/3); d1=rtc(x1); d2=rtc(x2); if (d1<=d2) re=x2; if (d1>=d2) st=x1; if (mxd>d1) { mxd=d1; anst=x1;} if (mxd==d1) anst=std::min(anst,x1); if (mxd>d2) { mxd=d2; anst=x2;} if (mxd==d2) anst=std::min(anst,x2); } } int main() { // freopen("input.txt", "r", stdin); int i; scanf("%d %d", &N, &T); for(i=0; i<N; i++) scanf("%d %d %d %d", &st[i].x, &st[i].y, &st[i].dx, &st[i].dy); TriS(); printf("%d\n%lld", anst, mxd); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

dist.cpp: In function 'int main()':
dist.cpp:95:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &N, &T);
  ~~~~~^~~~~~~~~~~~~~~~~
dist.cpp:96:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(i=0; i<N; i++) scanf("%d %d %d %d", &st[i].x, &st[i].y, &st[i].dx, &st[i].dy);
                     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...