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 阅读(368) 评论(0) 编辑 收藏 举报