题面

传送门

题解

调了咱一个上午……

首先考虑二分答案,那么每个点能够到达的范围是一个圆,这个圆与目标圆的交就是可行的区间,这个区间可以用极角来表示

首先,如果我们知道这个正\(n\)边形的转角,也就是它在水平的基础上转过了几度的话,那么可以把它的每个顶点和包含它的圆弧所代表的点连边,如果这个二分图存在完备匹配那么说明有解

然而我们并不知道这个多边形转过了几度

我们考虑一种可行的方案,如果它没有任何一个顶点和在一段圆弧的端点上,那么一定可以转一点点距离使其中一个顶点刚好落在一个圆弧的端点上,那么我们要考虑的转角实际上只有\(2n\)种

发现这是个正多边形,所以我们把所有的转角对\({2\pi\over n}\)取模,那么是等价的。然后把所有的转角从小到大排序,那么转角每次增大的时候只会新增一条边或者减少一条边。那么我们就不需要重新构图了,删边的时候直接退流,加边的时候看一下有没有新的增广路就行了

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
#define gg(u) for(int &i=cur[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=605,M=N*N;const double Pi=acos(-1.0),eps=1e-8;
struct eg{int v,nx,w;}e[M];int head[N],tot;
inline void add(R int u,R int v,R int w){
e[++tot]={v,head[u],w},head[u]=tot;
e[++tot]={u,head[v],0},head[v]=tot;
}
int n,r,S,T,h,t,u,v,x,y,flow,cur[N],dep[N],q[N];
bool bfs(){
fp(i,S,T)cur[i]=head[i],dep[i]=-1;
q[h=t=1]=S,dep[S]=0;
while(h<=t){
u=q[h++];
go(u)if(dep[v]<0&&e[i].w){
dep[v]=dep[u]+1,q[++t]=v;
if(v==T)return true;
}
}
return false;
}
int dfs(int u,int lim){
if(u==T||!lim)return lim;
int fl=0,f;
gg(u)if(dep[v]==dep[u]+1&&(f=dfs(v,min(lim,e[i].w)))){
fl+=f,lim-=f,e[i].w-=f,e[i^1].w+=f;
if(!lim)break;
}if(!fl)dep[u]=-1;
return fl;
}
void del(int u,int v){
for(R int i=head[v],j=0;i;j=i,i=e[i].nx)
if(e[i].v==u){j?(e[j].nx=e[i].nx):(head[v]=e[i].nx);break;}
for(R int i=head[u],j=0;i;j=i,i=e[i].nx)
if(e[i].v==v){
j?(e[j].nx=e[i].nx):(head[u]=e[i].nx);
if(e[i].w)return;
break;
}
--flow;
for(int i=head[S];i;i=e[i].nx)if(e[i].v==u){e[i].w^=1,e[i^1].w^=1;break;}
for(int i=head[T];i;i=e[i].nx)if(e[i].v==v){e[i].w^=1,e[i^1].w^=1;break;}
if(bfs())flow+=dfs(S,inf);
}
struct point{
int x,y;double len;
point(){}
point(R int xx,R int yy):x(xx),y(yy){len=sqrt(x*x+y*y);}
}p[N];
struct node{
double t;int u,v,op;
node(){}
node(R double tt,R int uu,R int vv,R int oop):t(tt),u(uu),v(vv),op(oop){}
inline bool operator <(const node &b)const{return t==b.t?op>b.op:t<b.t;}
}st[N];
double alp,ql,qr,mid;
bool ck(double mid){
fp(i,S,T)head[i]=0;tot=1;
int top=0;
fp(i,1,n){
if(p[i].len+r<=mid)fp(j,1,n)add(i,j+n,1);
else{
R double t=acos((p[i].len*p[i].len+r*r-mid*mid)/(2*p[i].len*r));
R double base=atan2(p[i].y,p[i].x);
R double l=base-t,r=base+t;
l<0?l+=2*Pi:0,r<0?r+=2*Pi:0;
int ll=l/alp,rr=r/alp;
st[++top]=node(l-ll*alp,i,ll+1,1),
st[++top]=node(r-rr*alp,i,rr+1,-1);
++ll,++rr;
if(l<=r)fp(j,ll+1,rr)add(i,j+n,1);
else{
fp(j,ll+1,n)add(i,j+n,1);
fp(j,1,rr)add(i,j+n,1);
}
}
}
fp(i,1,n)add(S,i,1),add(i+n,T,1);
sort(st+1,st+1+top),flow=0;
while(bfs())flow+=dfs(S,inf);
if(flow==n)return true;
fp(i,1,top)if(st[i].op<0)del(st[i].u,st[i].v+n);
else{
add(st[i].u,st[i].v+n,1);
if(bfs())flow+=dfs(S,inf);
if(flow==n)return true;
}
return false;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),r=read(),alp=2*Pi/n;
S=0,T=n+n+1;
fp(i,1,n)x=read(),y=read(),p[i]=point(x,y),cmax(ql,fabs(p[i].len-r)),cmax(qr,p[i].len+r);
while(qr-ql>eps)ck(mid=(ql+qr)/2)?qr=mid:ql=mid;
printf("%.8lf\n",ql);
return 0;
}

洛谷P4518 [JSOI2018]绝地反击(计算几何+二分图+退流)的更多相关文章

  1. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  2. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  3. 洛谷 P4016负载平衡问题【费用流】题解+AC代码

    洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...

  4. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

  5. 【洛谷2053】 [SCOI2007]修车(费用流)

    传送门 洛谷 Solution 考虑把每一个修车工人拆成\(n\)个点,那么考虑令\(id(i,j)\)为第\(i\)个工人倒数第\(j\)次修车. 然后就可以直接跑费用流了!!! 代码实现 /* m ...

  6. 【洛谷2050】 [NOI2012]美食节(费用流)

    大家可以先看这道题目再做! SCOI2007修车 传送门 洛谷 Solution 就和上面那道题目一样的套路,但是发现你会获得60~80分的好成绩!!! 考虑优化,因为是SPFA,所以每一次只会走最短 ...

  7. 洛谷P3376【模板】网络最大流 ISAP

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...

  8. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  9. 洛谷 P3386 【模板】二分图匹配

    题目背景 二分图 题目描述 给定一个二分图,结点个数分别为n,m,边数为e,求二分图最大匹配数 输入输出格式 输入格式: 第一行,n,m,e 第二至e+1行,每行两个正整数u,v,表示u,v有一条连边 ...

随机推荐

  1. 主表当中明细表字段的金额计算问题,操作控件是在gridview+aspnetPage

    做这个例子,主要是我在工作当中遇到一个主表的明细表的操作计算问题,也用了不少时间.操作计算的方式是这样的. 这个功能是在.net语言当中实现,操作过程当点击添加行,添加第一行时,当我输入金额的时候,累 ...

  2. 微信小程序中的倒计时

    这是我项目中的例子,如果有更好的建议欢迎留言 ,一起学习 //获取时间 var sekillStartTime = resultLis[0].planGroup0.sekillStartTime;// ...

  3. Class.forName和ClassLoader.loadClass区别(转)

    Java中class是如何加载到JVM中的:1.class加载到JVM中有三个步骤    装载:(loading)找到class对应的字节码文件.    连接:(linking)将对应的字节码文件读入 ...

  4. uboot启动正常,加载内核kernel启…

    先说现象吧:uboot能够正常启动,不过在kernel启动时却出现起不了的现象,停在这里 Uncompressing Linux.................................... ...

  5. idea写中文到mysql乱码

    idea中中文写入到mysql乱码 参考如下链接: https://segmentfault.com/q/1010000006174975/a-1020000006184639

  6. Java中的Constants类

    1.遇到代码中的问题 String userName = (String) request.getParameter("userName"); String passWord = ...

  7. 23-从零玩转JavaWeb-单例设计模式

    一.什么是设计模式 二.什么是单例设计模式 三.单例设计模式特点 四.单例设计模式优点 五.单例设计模式实现步骤   六.什么是工具类  

  8. Redis搭建(四):Sharding集群模式

    一. 方案 1. 介绍redis集群分为服务端集群(Cluster)和客户端分片(Sharding)服务端集群:redis3.0以上版本实现,使用哈希槽,计算key的CRC16结果再模16834.此处 ...

  9. 本博文将一步步带领你实现抽屉官网的各种功能:包括登陆、注册、发送邮箱验证码、登陆验证码、页面登陆验证、发布文章、上传图片、form验证、点赞、评论、文章分页处理以及基于tronado的后端和ajax的前端数据处理。

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tronado的后端和ajax的 ...

  10. POJ 3169 C - Layout

    题意 有n头奶牛从1到n编号,按照编号顺序站成一排,有可能有多头奶牛站在同一个坐标上.一些奶牛互相喜欢,所以他们的距离不能大于某个距离,一些奶牛互相讨厌,所以他们的距离不能小于某个距离,请计算如果可能 ...