几何+博弈的简单组合技

给出n个圆,有包含关系,以这个关系做游戏,每次操作可以选择把一个圆及它内部的圆全部删除,不能操作者输。

圆的包含关系显然可以看做是树型结构,所以也就是树上删边的游戏。

而找圆的包含关系,这题数据不大可用n^2复杂度找。也可以用扫描线,实时记录其节点父亲的情况。3种情况分类讨论一下就可以了。

/** @Date    : 2017-10-18 20:21:54
* @FileName: HDU 5299 圆扫描线+树上删边.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 2e4+20;
const double eps = 1e-8; struct yuu
{
double x, y, r;
yuu(){}
yuu(double _x, double _y, double _r):x(_x), y(_y), r(_r){}
}; yuu pt[N];
double scanx;
struct Node{
int id, flag;
Node(){}
Node(int i, int f):id(i),flag(f){}
bool operator <(const Node &b) const {
double dis1 = sqrt(pt[id].r*pt[id].r - (scanx - pt[id].x) * (scanx - pt[id].x));
double dis2 = sqrt(pt[b.id].r*pt[b.id].r - (scanx - pt[b.id].x) * (scanx - pt[b.id].x));
double y1 = pt[id].y + flag * dis1;
double y2 = pt[b.id].y + b.flag * dis2;
return y1 < y2 || (fabs(y1 - y2) < eps && flag < b.flag);
}
}; pair<double, int>evt[2*N];
vector<int>edg[N];
set<Node>st;
int cnt[N];
int fa[N]; void init(int n)
{
for(int i = 0; i <= n; i++)
{
fa[i] = 0;
edg[i].clear();
}
st.clear();
}
int get_sg(int x, int pre)
{
int res = 0;
for(auto i : edg[x])
{
if(i == pre)
continue;
res ^= 1 + get_sg(i, x);
}
return res;
} int main()
{
int T;
cin >> T;
while(T--)
{
int n;
scanf("%d", &n);
init(n);
for(int i = 1; i <= n; i++)
{
double x, y, r;
scanf("%lf%lf%lf", &x, &y, &r);
pt[i] = yuu(x, y, r);
evt[(i-1)*2] = MP(x - r, i);
evt[(i-1)*2 + 1] = MP(x + r, i + n);
}
sort(evt, evt + 2 * n); for(int i = 0; i < n * 2; i++)
{
scanx = evt[i].fi;
int t = evt[i].se;
if(t <= n)
{
int up = -1;
int dw = -1;
st.insert(Node(evt[i].se, -1));
auto pos = st.lower_bound(Node(evt[i].se,-1));
if((++pos) != st.end())
up = pos->id;
if((--pos) != st.begin())
dw = (--pos)->id;
if(up == dw && ~up)
{
fa[evt[i].se] = up;
edg[up].PB(evt[i].se);
}
else if(~dw && ~up)
{
if(fa[up] == fa[dw])
{
fa[evt[i].se] = fa[up];
edg[fa[up]].PB(evt[i].se);
}
else if(fa[up] == dw)
{
fa[evt[i].se] = dw;
edg[dw].PB(evt[i].se);
}
else if(fa[dw] == up)
{
fa[evt[i].se] = up;
edg[up].PB(evt[i].se);
}
}
else edg[0].PB(evt[i].se);
st.insert(Node(evt[i].se, 1));
}
else
{
st.erase(Node(evt[i].se-n, 1));
st.erase(Node(evt[i].se-n,-1));
}
}
/*for(int i = 0; i <= n; i++,cout<<endl)
{
cout<<i<<":";
for(auto j:edg[i])
printf("%d ", j);
}*/
int sg = get_sg(0, -1);
printf("%s\n", sg?"Alice":"Bob");
}
return 0;
}

HDU 5299 圆扫描线 + 树上删边的更多相关文章

  1. HDU 5299 Circles Game

    HDU 5299 思路: 圆扫描线+树上删边博弈 圆扫描线有以下四种情况,用set维护扫描线与圆的交点,重载小于号 代码: #pragma GCC optimize(2) #pragma GCC op ...

  2. HDU 3094 树上删边 NIM变形

    基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...

  3. 【HDU 3590】 PP and QQ (博弈-Anti-SG游戏,SJ定理,树上删边游戏)

    PP and QQ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. POJ Christmas Game [树上删边游戏 Multi-SG]

    传送门 题意: 有N 个局部联通的图.Harry 和Sally 轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走.Sally 为先手.图是通过从基础树中加一些边得到的.所有形成的环保证不共用 ...

  5. POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)

    题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...

  6. POJ 3710 无向图简单环树上删边

    结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...

  7. 【BZOJ 2688】 2688: Green Hackenbush (概率DP+博弈-树上删边)

    2688: Green Hackenbush Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 42  Solved: 16 Description   ...

  8. HDU5299 圆的扫描线 && 树上删边博弈

    HDU5299 圆的扫描线 && 树上删边博弈 标签(空格分隔): 未分类 给出若干个圆,可以互相嵌套但不相交或相切. 每次删去一个圆和它内部的圆,进行博弈,问谁赢. 分成两部分.首先 ...

  9. codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...

随机推荐

  1. 自己动手写Impala UDF

    本文由  网易云发布. 概述 出于对可扩展性和性能的考虑,UDF已变成大数据生态圈查询引擎的必备功能之一,无论是Calcite.Hive.Impala都对其进行支持,但是UDF的支持有利也有弊,好处在 ...

  2. PAT甲题题解-1081. Rational Sum (20)-模拟分数计算

    模拟计算一些分数的和,结果以带分数的形式输出注意一些细节即可 #include <iostream> #include <cstdio> #include <algori ...

  3. C. Classy Numbers

    链接 [http://codeforces.com/contest/1036/problem/C] 题意 给你l,r,让你找在这个闭区间内位数不为0不超过3的个数,1<=l,r<=1e18 ...

  4. 12.16daily_scrum

    这个阶段,我们组需要攻克的技术难题一个是测试及美化界面,另一个是在M1阶段的基础上进一步细化和完善悬浮窗的功能,具体的工作内容如下: 具体工作: 小组成员 今日任务 明日任务 工作时间 李睿琦 图片笔 ...

  5. C++:钻石继承与虚继承

    QUESTION:什么是钻石继承? ANSWER:假设我们已经有了两个类Father1和Father2,他们都是类GrandFather的子类.现在又有一个新类Son,这个新类通过多继承机制对类Fat ...

  6. word漏洞分析与利用

    众所周知,溢出漏洞从应用形式上可分为远程服务溢出漏洞和客户端(本地)溢出漏洞两类.远程服务溢出漏洞大家很熟悉了,红色代码.冲击波.振荡波等蠕虫都利用了此类漏洞,漏洞的调试和利用有相应的一套方法,前面的 ...

  7. 从零开始学Kotlin-类的继承(6)

    从零开始学Kotlin基础篇系列文章 Kotlin中的超类Any Kotlin 中所有类都继承超类 Any 类 class demo6 //默认继承超类Any class demo6 : Any() ...

  8. Selenium WebDriver VS Selenium RC

      WebDriver到底是什么? WebDriver是一个Web的自动化测试框架,它支持你执行你的测试用例在不同的浏览器上面,并不像Selenium一样只支持Firefox.     WebDriv ...

  9. centos 7 安装搜狗输入法

    1.安装alien依赖软件sudo yum install alien -y 2.安装依赖软件sudo yum install qtwebkit -ysudo yum install fcitx -y ...

  10. PGSQL 数据库备份练习

    截图先 慢慢说 1. 简单使用方法 先用 之前的setx 命令设置环境变量. set path=%PATH% ---其实第一步没必要..... 跟人学的 setx PATH "%path%& ...