hdu 5299 Circles Game(博弈)

题目链接:hdu 5299 Circles Game

每个分离的圆都是单独的游戏,Nim值为该圆嵌套中的圆的Nim和,最后加1.

#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <algorithm>

using namespace std;

const int maxn = 20005;
typedef long long ll;

struct Circle {
    int x, y, r;
    void input() {
        scanf("%d%d%d", &x, &y, &r);
    }
}C[maxn];

int N, Nim[maxn];
vector<int> G[maxn];

inline bool cmp(const Circle& a, const Circle& b) {
    return a.x < b.x;
}

inline int distance(int a, int b) {
    return a * a + b * b;
}

bool judge(const Circle& a, const Circle& b) {
    return (a.r > b.r) && distance(a.x - b.x, a.y - b.y) < a.r * a.r;
}

int fa[maxn];

void init () {

    scanf("%d", &N);
    memset(Nim, -1, sizeof(Nim));
    for (int i = 0; i < N; i++) {
        fa[i] = i;
        C[i].input();
        G[i].clear();
    }

    sort(C, C + N, cmp);

    for (int i = 0; i < N; i++) {
       for (int j = i + 1; j < N && C[j].x - C[i].x <= C[i].r; j++) {
           if (judge(C[i], C[j])) {
               if (fa[j] == j) fa[j] = i;
               else {
                   if (C[i].r < C[fa[j]].r) fa[j] = i;
               }
           }
       }
       for (int j = i - 1; j >= 0 && C[i].x - C[j].x <= C[i].r; j--) {
           if (judge(C[i], C[j])) {
               if (fa[j] == j) fa[j] = i;
               else {
                   if (C[i].r < C[fa[j]].r) fa[j] = i;
               }
           }
       }
    }
    for (int i = 0; i < N; i++) {
        if (fa[i] != i)
            G[fa[i]].push_back(i);
    }
}

int SG(int u) {
    if (Nim[u] != -1)
        return Nim[u];

    int& ret = Nim[u];
    ret = 0;
    for (int i = 0; i < G[u].size(); i++)
        ret ^= SG(G[u][i]);
    ret += 1;
    return ret;
}

int main () {
    int cas;
    scanf("%d", &cas);
    while (cas--) {
        init();
        int ans = 0;
        for (int i = 0; i < N; i++) {
            if (fa[i] == i)
                ans ^= SG(i);
        }
        printf("%s\n", ans ? "Alice" : "Bob");
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 12:57:06

hdu 5299 Circles Game(博弈)的相关文章

【SG博弈】HDU 5299 Circles Game

通道:http://acm.hdu.edu.cn/showproblem.php?pid=5299 题意:n个不相交相切的圆,每次操作删圆及其内部的圆,不能删者败. 思路:建边,然后树上SG即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <set> 4 #include <algorithm> 5 6 using namespace std; 7 8 const int MAX_N =

[多校2015.01.1012 博弈] hdu 5299 Circles Game

题意: 在无限大的平面内给你n个圆,两个圆之间只可能是包含或者相离 A和B每次选择一个圆,删除这个圆连通它所包含的所有圆 谁不能选择圆删除了,谁就输了 思路: 所有圆可以构造成一棵树,然后按树上SG博弈来做就好了. 树的删边游戏 规则如下: 给出一个有 N 个点的树,有一个点作为树的根节点. 游戏者轮流从树中删去边,删去一条边后,不与根节点相连的部分将被移走. 谁无路可走谁输. 我们有如下定理: [定理] 叶子节点的 SG 值为 0; 中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的

计数方法,博弈论(扫描线,树形SG):HDU 5299 Circles Game

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 go

HDU 5299 Circles Game

转化为树的删边游戏... 树的删边游戏 规则例如以下:  给出一个有 N 个点的树,有一个点作为树的根节点.  游戏者轮流从树中删去边,删去一条边后,不与根节点相连的 部分将被移走.  谁无路可走谁输. 我们有例如以下定理: [定理] 叶子节点的 SG 值为 0; 中间节点的 SG 值为它的全部子节点的 SG 值加 1 后的异或和. Circles Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/6553

hdu 2188 巴什博弈

巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规 定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个, 后取者都能够一次拿走剩余的物品,后者取胜.因此我们发现了如何取胜的法则:如果 n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走 k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的 取法,那么先取者肯定获胜.总

hdu 5165 Funny Game (博弈)

hdu 5165 Funny Game (博弈) 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5165 题意: Bob有一个数组{a1,a2,...,an},数组中的每个元素都是介于1到n之间的整数.Bob还有m个函数,他们的定义域和值域都是集合{1,2,...,n}.Bob和Alice轮流开始玩游戏,Alice先开始.对于每一轮,玩家可以选择一个函数f使得数组中每个元素 ai(1 <= i <= n)变成f(ai).例如,一开始数组是{1,

HDU 2147-kiki&#39;s game(博弈/找规律)

kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others) Total Submission(s): 9174    Accepted Submission(s): 5485 Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his

HDU 3544 (不平等博弈) Alice&#39;s Game

切巧克力的游戏,想得还是不是太明白. 后者会尽量选前着切后其中小的一块来切,那么先手须尽量取中间来切. So?题解都是这么一句话,不知道是真懂了还是从别人那抄过来的. 后来找到一个官方题解,分析得比较认真,但我这智商还是没懂太多,QAQ 本题我抄袭自<Winning Ways for your Mathematical Plays> ,一本关于游戏论的科普类图书.这题是一个组合游戏,但是并不是一个对等的组合游戏,所以试图使用 SG 函数相关知识解答是会面临巨大的挑战的. 书中本题的做法描述得十

hdu 5299(树上删边游戏) Circles Game

题意: 给你一些圆圈的圆心坐标和半径,保证这些圆圈是包含或者相离的.现在两个人做博弈操作,拿掉一个圆圈,然后这个圆圈所包含的都要移除掉.两个人一直拿下去,直到某个人找不到一个可以移除的圈他就输了. 思路 学习的姿势.这是一个树上删边游戏模型: 首先按照半径升序排序,然后对于每一个圆找第一个包含它的圆,然后连一条边.建树完成. 叶子节点的SG值为0; 中间节点的 SG 值为它的所有子节点的 SG 值加 1 后的异或和; 这里可以建立成森林或者直接一棵树,没有太大区别.建成一棵树估计要方便一些吧.