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);
}
View Code

 

posted @ 2013-05-25 22:02  zhang1107  阅读(188)  评论(0编辑  收藏  举报