hdu5299 Circles Game
Circles Game
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1427 Accepted Submission(s): 451
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.
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。
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
显然圆的包括关系能够构成一片森林,然后问题就能够转化为:每一步能够删除森林的一棵树或者某树的一棵子树。不能删者输。
这样。问题就变成经典的树上删边游戏了。
树上删边游戏有一个非常重要的结论:叶子节点的SG值为0,中间节点的SG值为它的全部子节点的SG值加1后的异或和。(证明详见贾志豪论文《组合游戏略述——浅谈SG游戏的若干拓展及变形》)
如今。我们的主要问题就是怎样把圆的包括关系转化为森林。这里要用到圆的扫描线算法。首先对于每一个圆。创建两个时间点,一个进入一个离开。再对全部时间点从小到大排序。
然后逐个处理时间点。用set维护全部圆。每遇到一个进入时间。分情况讨论圆的位置关系。然后把这个圆插入set中。每遇到一个离开时间,从set中删除这个圆。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<set>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define maxn 20010
using namespace std;
int t,n,cnt,tt,tmp;
int head[maxn],fa[maxn];
struct cir{int x,y,r;}a[maxn];
struct edge_type{int next,to;}e[maxn*2];
struct bor
{
int x,f,id;
friend bool operator < (bor a,bor b)
{
if (a.x==b.x) return a.f<b.f;
return a.x<b.x;
}
}q[maxn*2];
double get_h(int id,int x,int opt)
{
return a[id].y+opt*sqrt(a[id].r*a[id].r-(a[id].x-x)*(a[id].x-x));
}
struct pos
{
int id,opt;
pos(int a=0,int b=0){id=a;opt=b;}
friend bool operator < (pos a,pos b)
{
if (a.id==b.id) return a.opt<b.opt;
return get_h(a.id,tmp,a.opt)<get_h(b.id,tmp,b.opt);
}
};
set<pos> s;
set<pos>::iterator it;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void add_edge(int x,int y)
{
e[++cnt]=(edge_type){head[x],y};
head[x]=cnt;
fa[y]=x;
}
inline ll get(int x)
{
ll ret=0;
for(int i=head[x];i;i=e[i].next) ret^=get(e[i].to);
return ret+1;
}
int main()
{
t=read();
while (t--)
{
cnt=tt=0;
memset(fa,0,sizeof(fa));
memset(head,0,sizeof(head));
n=read();
F(i,1,n)
{
a[i].x=read();a[i].y=read();a[i].r=read();
q[++tt]=(bor){a[i].x-a[i].r,1,i};
q[++tt]=(bor){a[i].x+a[i].r,-1,i};
}
sort(q+1,q+tt+1);
F(i,1,tt)
{
if (q[i].f==1)
{
tmp=q[i].x;
it=s.lower_bound(pos(q[i].id,1));
if (it!=s.end())
{
if (it->opt==1) add_edge(it->id,q[i].id);
else if (fa[it->id]) add_edge(fa[it->id],q[i].id);
}
s.insert(pos(q[i].id,1));
s.insert(pos(q[i].id,-1));
}
else
{
s.erase(pos(q[i].id,1));
s.erase(pos(q[i].id,-1));
}
}
ll sum=0;
F(i,1,n) if (!fa[i]) sum=sum^get(i);
puts(sum?"Alice":"Bob");
}
}
- 顶
- 1
- 踩
- 0
查看评论
发表评论
* 以上用户言论仅仅代表其个人观点,不代表CSDN站点的观点或立场
- 个人资料
- 訪问:715643次
- 积分:11318
- 等级:
- 排名:第1575名
- 原创:417篇
- 转载:3篇
- 译文:0篇
- 评论:45条
- 云中谁寄锦书来
-
QQ:1045980567
微博:郭仲康Aaron
- 奔跑在光阴里的同行者
- 文章搜索
- 文章分类
- 追(4)
- 总结(5)
- 好题(148)
- 二分(16)
- 三分(2)
- 搜索(19)
- 数学(16)
- 模拟(7)
- 倍增(8)
- 贪心(13)
- 分块(11)
- 分治(7)
- 凸包(8)
- 虚树(1)
- LCA(2)
- RMQ(3)
- KMP(7)
- FFT(5)
- NTT(3)
- Hash(8)
- Floyd(4)
- Treap(11)
- Splay(11)
- 网络流(38)
- 线段树(44)
- 高精度(3)
- 并查集(7)
- 单调栈(5)
- 生成树(8)
- 离散化(6)
- 前缀和(5)
- 划分树(1)
- 树套树(4)
- 博弈论(2)
- 扫描线(3)
- 线性基(3)
- 二分图(2)
- 可并堆(4)
- Trie树(9)
- Tarjan(3)
- DFS序(8)
- 数位DP(4)
- 概率DP(7)
- 树形DP(6)
- 状压DP(5)
- 拓扑排序(5)
- 动态规划(78)
- 哈夫曼树(1)
- 优先队列(7)
- 最短路径(15)
- 树状数组(20)
- 单调队列(4)
- 线性规划(2)
- 后缀数组(6)
- 树链剖分(12)
- 莫队算法(4)
- 容斥原理(13)
- 分数规划(1)
- 矩阵乘法(3)
- 高斯消元(4)
- 旋转卡壳(2)
- 半平面交(5)
- 最小割树(1)
- 欧拉回路(1)
- C++语言(4)
- K-D Tree(2)
- CDQ分治(6)
- AC自己主动机(7)
- prufer编码(1)
- manacher(5)
- 回文自己主动机(1)
- 启示式合并(3)
- 树的点分治(4)
- 后缀自己主动机(5)
- 随机增量法(2)
- 最小圆覆盖(2)
- 最小表示法(1)
- link-cut tree(3)
- 斜率优化DP(9)
- Simpson积分(1)
- 计算几何基础(3)
- 弦图的点染色(1)
- 莫比乌斯反演(8)
- 差分约束系统(1)
- 切比雪夫距离(1)
- 平面图转对偶图(2)
- 最大权闭合子图(2)
- Matrix-Tree定理(1)
- Pollard-Rho算法(1)
- 可持久化数据结构(15)
-
阅读排行
- bzoj3998【TJOI2015】弦论(5577)
- bzoj3295【CQOI2011】动态逆序对(4950)
- bzoj3270 博物馆(4844)
- bzoj2683简单题(4613)
- bzoj2318 Spoj4060 game with probability Problem(4450)
- bzoj3223 Tyvj1729 文艺平衡树(4416)
- bzoj1415【NOI2005】聪聪和可可(4300)
- bzoj1176【Balkan2007】Mokia(4202)
- bzoj3143【HNOI2013】游走(4190)
- bzoj1492【NOI2007】货币兑换Cash(4124)
posted on 2018-01-11 19:41 cynchanpin 阅读(397) 评论(0) 收藏 举报
浙公网安备 33010602011771号