bzoj5183 [Baltic2016]Park
题目描述:
题解:
把坐标系看反了持续$WA$系列。
对偶图+并查集维护。
先处理出树对树、树对墙的空隙,然后把人和空隙按从小到大排序。
用并查集维护四面墙之间是否能互相隔断。
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
const int M = ;
const double eps = 1e-;
template<typename T>
inline void read(T&x)
{
T f = ,c = ;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){c=c*+ch-'';ch=getchar();}
x = f*c;
}
int n,m,X[],Y[],ff[N];
double W,H;
int findff(int x){return x==ff[x]?x:ff[x]=findff(ff[x]);}
struct Tree
{
double x,y,r;
void rd(){scanf("%lf%lf%lf",&x,&y,&r);}
}t[N];
double sqr(double k){return k*k;}
double dis(int i,int j){return sqrt(sqr(t[i].x-t[j].x)+sqr(t[i].y-t[j].y));}
int tot;
struct Hole
{
double k;
int x,y;
Hole(){}
Hole(double k,int x,int y):k(k),x(x),y(y){}
}h[N*N];
bool cmp(Hole a,Hole b){return a.k<b.k;}
int ans[M];
struct Peo
{
double r;
int c,id;
void rd(int i){scanf("%lf",&r),r*=;read(c),c--;id=i;}
}p[M];
bool vmp(Peo a,Peo b){return a.r<b.r;}
void merge(int x,int y)
{
x = findff(x),y = findff(y);
if(x!=y)ff[x]=y;
}
bool cX(){return findff(X[])==findff(X[]);}
bool cY(){return findff(Y[])==findff(Y[]);}
int Xi[]={,,,},Yi[]={,,,};
bool cC(int cn){return findff(X[Xi[cn]])==findff(Y[Yi[cn]]);}
void ot(int x)
{
for(int i=;i<;i++)if(ans[x]&(<<i))
putchar(''+i);
puts("");
}
int main()
{
read(n),read(m);
scanf("%lf%lf",&W,&H);
X[] = n+,X[] = n+,Y[] = n+,Y[] = n+;
for(int i=;i<=n+;i++)ff[i]=i;
for(int i=;i<=n;i++)
{
t[i].rd();
h[++tot] = Hole(t[i].x-t[i].r,i,Y[]);
h[++tot] = Hole(t[i].y-t[i].r,i,X[]);
h[++tot] = Hole(W-t[i].x-t[i].r,i,Y[]);
h[++tot] = Hole(H-t[i].y-t[i].r,i,X[]);
}
for(int i=;i<=n;i++)for(int j=i+;j<=n;j++)
h[++tot] = Hole(dis(i,j)-t[i].r-t[j].r,i,j);
for(int i=;i<=m;i++)p[i].rd(i);
sort(p+,p++m,vmp),sort(h+,h++tot,cmp);
for(int i=,j=;i<=m;i++)
{
while(h[j].k+eps<p[i].r&&j<=tot)
merge(h[j].x,h[j].y),j++;
bool cx = cX(),cy = cY();int cc = p[i].c;
if(cC(cc)){ans[p[i].id]=(<<cc);continue;}
if(cx&&cy)ans[p[i].id]=(<<cc);
else if(cx&&!cy)ans[p[i].id]=((<<cc)|(<<(cc^)));
else if(!cx&&cy)ans[p[i].id]=((<<cc)|(<<(cc^)));
else ans[p[i].id]=;
for(int cn=;cn<;cn++)
if(cC(cn)&&(ans[p[i].id]&(<<cn)))ans[p[i].id]^=(<<cn);
}
for(int i=;i<=m;i++)ot(i);
return ;
}
bzoj5183 [Baltic2016]Park的更多相关文章
- 【bzoj5183】[Baltic2016]Park 离线+对偶图+并查集
题目描述 在Byteland的首都,有一个矩形围栏围起来的公园.在这个公园里树和访客都以一个圆形表示.公园有四个出入口,每个角落一个(1=左下角,2=右下角,3=右上角,4=左上角).访客能通过这些出 ...
- hdu4607 Park Visit(树的直径)
Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Codeforces Round #292 (Div. 1) C. Drazil and Park 线段树
C. Drazil and Park 题目连接: http://codeforces.com/contest/516/problem/C Description Drazil is a monkey. ...
- 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)
在工作中,我也逐渐了解到park,unpark,ord对于二进制字节处理的强大. 下面我逐一介绍它们. park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一 ...
- Kefa and Park
#include<bits/stdc++.h> #define max 100005 using namespace std; int cats[max]; vector<int&g ...
- UVALive 4221 Walk in the Park 扫描线
Walk in the Park 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemi ...
- B. Om Nom and Dark Park
B. Om Nom and Dark Park 在满二叉树上的某些边上添加一些值.使得根节点到叶子节点的路径上的权值和都相等.求最少需要添加多少. 我们利用性质解题. 考察兄弟节点.由于他们从跟节 ...
- Codeforces Round #321 (Div. 2) C. Kefa and Park dfs
C. Kefa and Park Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/probl ...
- LockSupport的park和unpark
LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语. Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Lo ...
随机推荐
- 【OpenJ_Bailian - 2287】Tian Ji -- The Horse Racing (贪心)
Tian Ji -- The Horse Racing 田忌赛马,还是English,要不是看题目,我都被原题整懵了,直接上Chinese吧 Descriptions: 田忌和齐王赛马,他们各有n匹马 ...
- 使用MethodSwizzle导致按home app进入后台或者app间切换发生crash的解决方法
参考文章: 1.http://blog.csdn.net/alincexiaohao/article/details/45913857 2.http://www.cocoachina.com/ios/ ...
- 51Nod 1272 最大距离 (栈或贪心)
#include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...
- 洛谷 P1169||bzoj1057 [ZJOI2007]棋盘制作
洛谷P1169 bzoj1057 这个题目跟最大全0子矩阵是类似的.正方形的话,只要把任意极大子正方形(”极大“定义见后面的”论文“)当成把某个极大子矩形去掉一块变成正方形即可,容易解决. 解法1:看 ...
- 利用HttpClient4访问网页
一.HttpClient介绍 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是它没有提供足够的灵活性和其他应用程序需要的功能.HttpClient 是 Apac ...
- 使用tmodjs
1.安装 npm install -g tmodjs 2.配置 我的模板都放在tpl文件夹中,htmls用于存放模板页面,每一个后缀名都是.html,而build用于存放编译后输出的模板js. 如果不 ...
- Redis的发布和订阅
Redis的发布和订阅 Redis发布订阅(pub/sub)是一种消息通信模式,pub发布消息,sub接收消息.(pub/sub)是一种生产者消费者模式,是实现消息队列的一种方式 redis的订阅和发 ...
- 下面给出了四种设计模式的作用: 外观(F
下面给出了四种设计模式的作用: 外观(Fa?ade :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用: 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动 ...
- sql server 日期 查询技巧
CONVERT(varchar(100), SendTime, 23) –-sql里的字段SendTime参数 selectdateName(weekday,getDate());--返回当前星期 s ...
- Java编程基础-面向对象(上)
一.面向对象的概念 1.概念:面向对象是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能.这 ...