zoukankan      html  css  js  c++  java
  • HDOJ 5299 Circles Game 圆嵌套+树上SG


    将全部的圆化成树,然后就能够转化成树上的删边博弈问题....

    Circles Game

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 881    Accepted Submission(s): 255


    Problem Description
    There are n circles on a infinitely large table.With every two circle, either one contains another or isolates from the other.They are never crossed nor tangent.
    Alice and Bob are playing a game concerning these circles.They take turn to play,Alice goes first:
    1、Pick out a certain circle A,then delete A and every circle that is inside of A.
    2、Failling to find a deletable circle within one round will lost the game.
    Now,Alice and Bob are both smart guys,who will win the game,output the winner's name.
     

    Input
    The first line include a positive integer T<=20,indicating the total group number of the statistic.
    As for the following T groups of statistic,the first line of every group must include a positive integer n to define the number of the circles.
    And the following lines,each line consists of 3 integers x,y and r,stating the coordinate of the circle center and radius of the circle respectively.
    n≤20000,|x|≤20000,|y|≤20000。r≤20000。
     

    Output
    If Alice won,output “Alice”,else output “Bob”
     

    Sample Input
    2 1 0 0 1 6 -100 0 90 -50 0 1 -20 0 1 100 0 90 47 0 1 23 0 1
     

    Sample Output
    Alice Bob
     

    Author
    FZUACM
     

    Source
     



    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    
    using namespace std;
    
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    const int maxn=20200;
    
    int n;
    struct Circle
    {
        int x,y,r;
        bool operator<(const Circle& cir) const
        {
            return r>cir.r;
        }
    }circle[maxn];
    
    double dist(int a,int b)
    {
        return sqrt((circle[a].x-circle[b].x)*(circle[a].x-circle[b].x)
    			+(circle[a].y-circle[b].y)*(circle[a].y-circle[b].y));
    }
    
    vector<int> edge[maxn];
    
    void Link(int u,int x)
    {
        bool fg=true;
    	for(int i=0,sz=edge[u].size();i<sz;i++)
        {
            int v=edge[u][i];
            double dd=dist(x,v);
            if(dd+circle[x].r>circle[v].r) continue;
            fg=false;
            Link(v,x);
    		return ;
        }
        if(fg) edge[u].push_back(x);
    }
    
    int dp[maxn];
    
    void dfs(int u)
    {
        int ret=-1;
    	for(int i=0,sz=edge[u].size();i<sz;i++)
        {
            int v=edge[u][i];
            dfs(v);
            if(ret==-1) ret=dp[v]+1;
            else ret^=dp[v]+1;
        }
        if(ret==-1) ret=0;
        dp[u]=ret;
    }
    
    int main()
    {
        int T_T;
        scanf("%d",&T_T);
        while(T_T--)
        {
            scanf("%d",&n);
            for(int i=1,x,y,r;i<=n;i++)
            {
                scanf("%d%d%d",&x,&y,&r);
                //circle[i]=(Circle){x,y,r};
                circle[i].x=x;
                circle[i].y=y;
                circle[i].r=r;
    			edge[i].clear();
            }
    		edge[0].clear();
            sort(circle+1,circle+1+n);
            for(int i=1;i<=n;i++) 
            {
                Link(0,i); dp[i]=0;
            }
            dfs(0);
            if(dp[0]==0) puts("Bob");
            else puts("Alice");
        }
        return 0;
    }
    



  • 相关阅读:
    redis 集群
    redis--主从复制
    redis--AOF
    React——组件
    React——文件夹分析
    WEB面试
    WEB基础——接收后台文件方法
    WEB基础——AJAX
    C#进阶——IOC
    C#基础——HttpContext
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7183781.html
Copyright © 2011-2022 走看看