HDU 5299 圆扫描线 + 树上删边
几何+博弈的简单组合技
给出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 圆扫描线 + 树上删边的更多相关文章
- HDU 5299 Circles Game
HDU 5299 思路: 圆扫描线+树上删边博弈 圆扫描线有以下四种情况,用set维护扫描线与圆的交点,重载小于号 代码: #pragma GCC optimize(2) #pragma GCC op ...
- HDU 3094 树上删边 NIM变形
基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...
- 【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 ...
- POJ Christmas Game [树上删边游戏 Multi-SG]
传送门 题意: 有N 个局部联通的图.Harry 和Sally 轮流从图中删边,删去一条边后,不与根节点相连的部分将被移走.Sally 为先手.图是通过从基础树中加一些边得到的.所有形成的环保证不共用 ...
- POJ.3710.Christmas Game(博弈论 树上删边游戏 Multi-SG)
题目链接 \(Description\) 给定n棵"树",每棵"树"的节点可能"挂着"一个环,保证没有环相交,且与树只有一个公共点. 两人轮 ...
- POJ 3710 无向图简单环树上删边
结论题,这题关键在于如何转换环,可以用tarjan求出连通分量后再进行标记,也可以DFS直接找到环后把点的SG值变掉就行了 /** @Date : 2017-10-23 19:47:47 * @Fil ...
- 【BZOJ 2688】 2688: Green Hackenbush (概率DP+博弈-树上删边)
2688: Green Hackenbush Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 42 Solved: 16 Description ...
- HDU5299 圆的扫描线 && 树上删边博弈
HDU5299 圆的扫描线 && 树上删边博弈 标签(空格分隔): 未分类 给出若干个圆,可以互相嵌套但不相交或相切. 每次删去一个圆和它内部的圆,进行博弈,问谁赢. 分成两部分.首先 ...
- codeforces gym #101161F-Dictionary Game(字典树+树上删边游戏)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给一个可以变化的字典树 在字典树上删边 如果某条边和根节点不连通那么这条边也删除 谁没得删 ...
随机推荐
- 基于HTTPS的中间人攻击-BaseProxy
前言 在上一篇文章BaseProxy:异步http/https代理中,我介绍了自己的开源项目BaseProxy,这个项目的初衷其实是为了渗透测试,抓包改包.在知识星球中,有很多朋友问我这个项目的原理及 ...
- dokuwiki 配置 sendmail 邮件发送
dokuwiki 发送邮件有2种方式: 一是直接使用 PHP 自带发送功能,需要配置 PHP.ini 文件, 我没试过,可参考官网 https://www.dokuwiki.org/tips:mail ...
- sass:常用备忘
一.变量 所有变量以$开头 $font_size: 12px; .container{ font-size: $font_size; } 如果变量嵌套在字符串中,需要写在#{}中 $side : le ...
- tomcat-内存溢出java.lang.OutOfMemoryErrory:PermGen space解决方法
如果是PermGen space方法区内存溢出,可尝试加大MaxPermSize,如果是heap space 堆内存移除,可尝试修改Xmx 正常解决方法: 在注释下的第一行添加: JAVA_OPTS= ...
- 腾讯/阿里/百度 BAT人才体系的职位层级、薪酬、晋升标准
互联网圈有这么一句话:百度的技术,阿里的运营,腾讯的产品.那么代表互联网三座大山的BAT,内部人才体系有什么区别呢?今天老李就带领大家看一看~ ★ 腾讯 ★ 1. 职级 腾讯职级体系分6级,最低1 ...
- 【容器魔方解读】AWS Re:Invent 2018大会
每年云计算领域技术与商业风向标之一的AWS Re:Invent大会上周在美国拉斯维加斯召开,如往届一样,AWS密集发布了上百项的新产品或新技术.随着国内近两年云计算尤其是公有云的普及度越来越高,国内各 ...
- 团队项目M1展示成绩和Week 10分数
根据M1项目评审的分数,分档打分得到的M1项目成绩.
- 《Linux内核分析》 第三周 构造一个简单的Linux系统MenuOS
Linux内核分析 第三周 构造一个简单的Linux系统MenuOS 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/ ...
- wordpress学习三:wordpress自带的模板学习
在<学习二>里,大概说了下怎么去查找模板,本节我们以一个简单的模板为例子,继续说说wordpress的模板机制,看看做一个自己的模板需要哪些知识点. 页面模板渲染 wordpress的模板 ...
- Daily Scrum - 11/20
好习惯的养成需要两个星期. ——砖家 今天我们小组又进行了一次愉快的例会,可以看到daily scrum在我们小组已经逐渐变成了每日的好习惯.首先对以下一些团队routine达成了共识: 1.spri ...