HDU 4562 守护雅典娜
const int MM = 1000+5; #define debug puts("wrong") #define inf 1000000 #define mod 1000000007 int N,M,K, L; int g=1; void printcase() {printf("Case %d: ",g++);} struct Point{ int x,y,r; bool friend operator<(Point a,Point b) { return a.r<b.r; } }num1[MM],num2[MM]; Point start, end; int cnt1, cnt2; int sqr(int x) { return (x)*(x); } int dis(Point a,Point b) { int tmp=sqr(a.x-b.x)+sqr(a.y-b.y); return tmp; } bool ok(Point a) { int t1=dis(a,end),t2=dis(a,start),rr=sqr(a.r); if(t1==rr) return false; if(t2==rr) return false; if(t2>rr && t1<rr) return true; return false; } bool ok1(Point a) { int t1=dis(a,end),t2=dis(a,start),rr=sqr(a.r); if(t1==rr) return false; if(t2==rr) return false; if(t2<rr && t1>rr) return true; return false; } bool in(Point a,Point b) { int t1=dis(a,b), rr=sqr(a.r-b.r); return t1<rr; } bool out(Point a,Point b) { int t1=dis(a,b), rr=sqr(a.r+b.r); return t1>rr; } void get_data() { int i,j,k; Point tmp; start.x=0, start.y=0; scanf("%d%d%d",&N,&end.x,&end.y); for(i=cnt1=cnt2=0;i<N;i++) { scanf("%d%d%d",&tmp.x,&tmp.y,&tmp.r); if(ok1(tmp)) { num1[cnt1++]=tmp; } if(ok(tmp)) num2[cnt2++]=tmp; } // printf("**%d %d**\n",cnt1,cnt2); } int dp1[MM], dp2[MM]; void solve() { int i,j,k,tmp; printcase(); for(i=0;i<MM;i++) dp1[i]=dp2[i]=1; // sort(num1,num1+cnt1); for(i=0;i<cnt1;i++) { for(j=tmp=0;j<cnt1;j++) { if(i==j) continue; if(in(num1[i],num1[j])) { if(num1[i].r>num1[j].r) tmp=max(tmp,dp1[j]); } dp1[i]=tmp+1; } } // sort(num2,num2+cnt2); for(i=0;i<cnt2;i++) { for(j=tmp=0;j<cnt2;j++) { if(i==j) continue; if(in(num2[i],num2[j])) { if(num2[i].r>num2[j].r) tmp=max(tmp,dp2[j]); } dp2[i]=tmp+1; } } int ans=0; // for(i=0;i<cnt1;i++) printf("**%d ",dp1[i]); printf("\n"); // for(i=0;i<cnt2;i++) printf("**%d ",dp2[i]); printf("\n"); for(i=0;i<cnt1;i++) ans=max(ans,dp1[i]); for(i=0;i<cnt2;i++) ans=max(ans,dp2[i]); for(i=0;i<cnt1;i++) { for(j=0;j<cnt2;j++) { if(out(num1[i],num2[j])) ans=max(ans,dp1[i]+dp2[j]); } } printf("%d\n",ans); }