传送门
思路:
两个板子的结合
如果会方法的话没什么难度
至于为什么要写这个博客呢?
只是拿来当板子用……
圆的扫描线理解了好久,终于想出来是怎么一回事了
我觉得这种东西还是自己主动去思考的好,写的长篇大论也没什么人能看下去
注意上下圆的情况讨论即可
代码:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<set>
#define M 20005
using namespace std;
int n,tot,T,seg,root;
int first[M],X[M],Y[M],R[M],dep[M],fa[M];
struct edge{int v,next;
}e[M<<1];
struct Point{int tp,id,data;
}a[M<<1];
double dis(int tp,int id)
{if (tp)return Y[id]+sqrt(1.0*R[id]*R[id]-1.0*(X[id]-seg)*(X[id]-seg));elsereturn Y[id]-sqrt(1.0*R[id]*R[id]-1.0*(X[id]-seg)*(X[id]-seg));
}
struct node{int tp,id;bool operator <(const node other)const{if (id==other.id) return tp>other.tp;return dis(tp,id)>dis(other.tp,other.id);}
};
set<node> s;
set<node>::iterator it1,it2;
bool cmp(Point a,Point b){return a.data<b.data;}
int in()
{int t=0;char ch=getchar();bool f=0;while (ch>'9'||ch<'0') f=(ch=='-'),ch=getchar();while (ch>='0'&&ch<='9') t=(t<<1)+(t<<3)+ch-48,ch=getchar();return f?-t:t;
}
void add(int x,int y){e[++tot]=(edge){y,first[x]};first[x]=tot;}
int dfs(int x)
{if (!first[x]) return 0;int sg=0;for (int i=first[x];i;i=e[i].next)sg^=dfs(e[i].v)+1;return sg;
}
void work()
{n=in();memset(first,0,sizeof(first));tot=0;for (int i=1;i<=n;++i)X[i]=in(),Y[i]=in(),R[i]=in(),a[i*2-1]=(Point){1,i,X[i]-R[i]},a[i*2]=(Point){0,i,X[i]+R[i]};sort(a+1,a+n*2+1,cmp);for (int i=1;i<=n*2;++i){seg=a[i].data;if (a[i].tp){node t1,t2,tmp=(node){1,a[i].id};it1=s.lower_bound(tmp);--it1;it2=s.upper_bound(tmp);t1=*it1;t2=*it2;if (t1.id==t2.id)fa[a[i].id]=t1.id,dep[a[i].id]=dep[t1.id]+1;else if (dep[t1.id]==dep[t2.id])dep[a[i].id]=dep[t1.id],fa[a[i].id]=fa[t1.id];else if (dep[t1.id]>dep[t2.id])dep[a[i].id]=dep[t1.id],fa[a[i].id]=t2.id;elsedep[a[i].id]=dep[t2.id],fa[a[i].id]=t1.id;add(fa[a[i].id],a[i].id);s.insert((node){1,a[i].id});s.insert((node){0,a[i].id});}elses.erase((node){1,a[i].id}),s.erase((node){0,a[i].id});}if (dfs(root)) puts("Alice");else puts("Bob");
}
main()
{root=20001;R[root]=50000;fa[root]=root;s.insert((node){1,root});s.insert((node){0,root});for (T=in();T;--T) work();
}

【HDU5299】Circles Game,圆的扫描线+树上删边游戏相关推荐

  1. 树上删边游戏及其拓展(公平博弈:克朗原理+费森原理)

    参考资料 问题描述 在某一棵树上删除一条边,同时删去所有在删除后不再与根相连的部分 双方轮流操作,无法再进行删除者判定为失败 一个游戏中有多棵树,我们把ta们的根都放在地板上,方便之后的处理 在此,我 ...

  2. HDU 3094 树上删边 NIM变形

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

  3. 博弈——无向图删边游戏

    关于无向图删边游戏,首先游戏的规则如下: 然后看下最关键的定理: 叶子节点的 SG 值为 0; 中间节点的 SG 值为它的所有子节点的 SG 值 加 1 后的异或和. 精彩证明: 有了这个定理,这个问 ...

  4. hdu5299 Circles Game

    题意是这样.给出非常多圆,要么两两相离,要么包括,若删掉一个圆,那被他包括的都要删除,若某人没有圆给他删,那么他就赢了. ...知道树上博弈的话.就非常easy. ..不知道的话.这确实是个神题-- ...

  5. 图删边游戏(强连通分量)

    图删边游戏 时间限制 : 10000 MS 空间限制 : 65536 KB 单个测试点为1000MS 问题描述 Alice & Bob有一天发现了一株奇怪的灌木.他的枝分叉之后又可以汇合.更奇 ...

  6. HDU 3590 PP and QQ(反nim博弈,删边游戏)

    PP and QQ 思路 删边游戏了解一下,其实就是个nim博弈吧,只是删边个数有特殊限制, 然后就是一个反nim博弈了. 删边定理: 遇到分叉口时,它的子树上的可操作的sg函数为所有子树节点的sg函 ...

  7. CF1593 E. Gardener and Tree (树上删叶子,BFS)

    E. Gardener and Tree 分析: 在树上,从外层到里层逐层删叶子 跑一遍 BFSBFSBFS 即可 #include <bits/stdc++.h> using names ...

  8. 【UVALive 4642】Malfatti Circles(圆,二分)

    题 给定三角形,求三个两两相切且与三角形的一条边相切的圆的半径. 二分一个半径,可以得出另外两个半径,需要推一推公式(太久了,我忘记了) #include<cstdio> #include ...

  9. 【POJ3710】Christmas Game 博弈 有限制的图上删边游戏(树形删边游戏进化1)

    转载请注明出处:http://blog.csdn.net/vmurder/article/details/42671885 其实我就是觉得原创的访问量比未授权盗版多有点不爽233... 题意: 一个树 ...

最新文章

  1. java 数组的基本操作
  2. python虚拟环境
  3. 机器学习特征工程之连续变量离散化:等宽分箱
  4. R构建二次回归模型( Quadratic Regression)
  5. [改善Java代码]线程优先级只使用三个等级
  6. 如何及时获得AI顶尖科研团队的最新论文与进展?你需要一份AI内参!
  7. No result defined for action action.LoginAction and result success 问题解决
  8. Shiro安全框架入门篇
  9. java语言的科学与艺术-编程练习10.4
  10. matlab对角替换,matlab矩阵对角最大化实现
  11. 风变编程python24_如何看待风变编程的 Python 网课?
  12. poj 3626 Mud Puddles
  13. 射频电路板设计常见的问题分析和解决办法
  14. Spring Boot踩坑记之Whitelabel Error Page问题
  15. Linux中mysql的重启
  16. 图像增强(拉普拉斯锐化增强)
  17. ELO算法原理及实现
  18. python访问陌生人qq空间_使用Python+Selenium模拟登录QQ空间
  19. linux 编译配置内核路由功能,Linux下多播路由的实现-网管专栏,防火墙和路由
  20. PM——市场及用户分析(理论)

热门文章

  1. 【华为云技术分享】GitHub联合开发
  2. 【华为云技术分享】自动网络搜索(NAS)在语义分割上的应用(一)
  3. 寒冬袭来,带你使用Flask开发一款天气查询软件吧
  4. 【产品评测】华为开源镜像站体验:美好终将不期而遇
  5. 【华为大咖分享】2.DevCloud on DevCloud 从1月1次到1天10次发布的实践分享(后附PPT下载地址)
  6. python scrapy框架爬虫_Python Scrapy爬虫框架
  7. c#split方法拆分为数据_【转载】C#使用Split函数根据特定分隔符分割字符串
  8. 如何读取tensorboard文件 展现可视化
  9. 创建选修专业表oracle,数据库及数据表的创建与删除 (Oracle实验)
  10. 链路两段不同网段怎么通信_交换机互联不同vlan及不同网段通信问题总结