[bzoj3630][JLOI2014]镜面通道_计算几何_网络流_最小割
镜面通道 bzoj-3630 JLOI-2014
题目大意:题目链接。
注释:略。
想法:
我们发现,只要上下界没有被完全封死,我们就一定有一条合法的光路。
所以只需要将上界和下界拆开即可。
拆点,把每个点分为入点和出点,入点向出点连1的边。
元件之间如果连通就连$inf$。
和上界连通就对源点连$inf$,和下界连通就和汇点连$inf$。
最后求最小割即为答案。
Code:
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 303
#define M 370000
#define inf 0x7fffffff
#define ll long long
using namespace std;
int to[M],hd[M],lk[N<<1],len[M],cnt=1,T;
void add(int u,int v,int w)
{
to[++cnt]=v,hd[cnt]=lk[u],len[cnt]=w,lk[u]=cnt;
to[++cnt]=u,hd[cnt]=lk[v],lk[v]=cnt;
}
struct pt
{
ll x,y;
void read()
{scanf("%lld%lld",&x,&y);}
}tp1,tp2;
inline ll Dis(pt a,pt b)
{return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}
struct cir
{pt o;int r;}Cir[N];
struct rec
{pt x1,x2;}Rec[N],ss,tt;
short n,loc[N];
int X,Y,ans;
ll d,xx,yy;
bool judge(cir a,rec b)
{
d=a.r,xx=a.o.x,yy=a.o.y;
if(xx>=b.x1.x-d&&xx<=b.x2.x+d&&yy>=b.x1.y&&yy<=b.x2.y
||xx>=b.x1.x&&xx<=b.x2.x&&yy>=b.x1.y-d&&yy<=b.x2.y+d)return 1;
tp1.x=b.x1.x,tp2.y=b.x2.y,tp2.x=b.x2.x,tp2.y=b.x1.y;d*=d;
return Dis(a.o,tp1)<=d||Dis(a.o,tp2)<=d||Dis(a.o,b.x1)<=d||Dis(a.o,b.x2)<=d;
}
bool check(int a,int b)
{
if(loc[a]>loc[b])swap(a,b);
if(loc[b]<2)return((Cir[a].r+Cir[b].r)*(Cir[a].r+Cir[b].r)>=Dis(Cir[a].o,Cir[b].o));
if(loc[a]>1)return (Rec[a].x1.x<=Rec[b].x1.x&&Rec[b].x1.x<=Rec[a].x2.x||
Rec[a].x1.x<=Rec[b].x2.x&&Rec[b].x2.x<=Rec[a].x2.x)&&
(Rec[a].x1.y<=Rec[b].x1.y&&Rec[b].x1.y<=Rec[a].x2.y||
Rec[a].x1.y<=Rec[b].x2.y&&Rec[b].x2.y<=Rec[a].x2.y);
return judge(Cir[a],Rec[b]);
}
int k,q[N<<1],h,t,dis[N<<1],cur[N<<1];
bool bfs()
{
for(int i=0;i<=T;i++)
dis[i]=0,cur[i]=lk[i];
h=0,t=dis[0]=1;
while(h<t)
{
k=q[h++];
for(int i=lk[k];i;i=hd[i])
if(len[i]&&!dis[to[i]])
dis[q[t++]=to[i]]=dis[k]+1;
}
return dis[T];
}
int dfs(int x,int f)
{
if(x==T||!f)return f;
int r=0,cst;
for(int &i=cur[x];i;i=hd[i])
if(dis[to[i]]==dis[x]+1)
{
cst=dfs(to[i],f<len[i]?f:len[i]);
f-=cst,len[i]-=cst;
r+=cst,len[i^1]+=cst;
if(!f)break;
}
if(!r)dis[x]=0;
return r;
}
int main()
{
scanf("%d%d",&X,&Y);
ss={{0,0},{X,0}};tt={{0,Y},{X,Y}};
scanf("%d",&n);T=n<<1|1;
for(int i=1;i<=n;i++)
{
add(i,i+n,1);
scanf("%d",loc+i);
if(loc[i]<2)
{
Cir[i].o.read(),scanf("%lld",&Cir[i].r);
if(judge(Cir[i],ss))add(0,i,inf);
if(judge(Cir[i],tt))add(i+n,T,inf);
}
else
{
Rec[i].x1.read(),Rec[i].x2.read();
if(Rec[i].x1.y<=0&&Rec[i].x1.x<=X&&Rec[i].x2.x>=0)add(0,i,inf);
if(Rec[i].x2.y>=Y&&Rec[i].x1.x<=X&&Rec[i].x2.x>=0)add(i+n,T,inf);
}
for(int j=1;j<i;j++)
if(check(j,i))
add(j+n,i,inf),add(i+n,j,inf);
}
while(bfs())ans+=dfs(0,inf);
printf("%d",ans);
}
小结:好题好题。就是特判有点恶心。
[bzoj3630][JLOI2014]镜面通道_计算几何_网络流_最小割的更多相关文章
- 【bzoj3630】[JLOI2014]镜面通道 对偶图+计算几何+网络流最小割
题目描述 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表面为镜面的光学元件,光学元件α为圆形,光学元件β为矩形(这些元件 ...
- BZOJ3630 : [JLOI2014]镜面通道
从左边不能到达右边当且仅当存在一条与上下底边相连的分割线将它们分开 设下底边为S,上底边为T,每个元件作为点,有公共部分的两个点互相连边 最后拆点求最小割 #include<cstdio> ...
- 【BZOJ3630】[JLOI2014]镜面通道 几何+最小割
[BZOJ3630][JLOI2014]镜面通道 Description 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表 ...
- 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)
[BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...
- 【CF331E】Biologist(网络流,最小割)
[CF331E]Biologist(网络流,最小割) 题面 洛谷 翻译: 有一个长度为\(n\)的\(01\)串,将第\(i\)个位置变为另外一个数字的代价是\(v_i\). 有\(m\)个要求 每个 ...
- 【BZOJ1391】Order(网络流,最小割)
[BZOJ1391]Order(网络流,最小割) 题面 BZOJ权限题... 良心洛谷 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成 ...
- 【BZOJ3144】切糕(网络流,最小割)
[BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...
- [TJOI2013]攻击装置(网络流,最小割)
前言 网络流被hbx吊起来打 Solution 考虑一下这个走法是不是和象棋中马的走法一模一样(废话) 那么显然我每一次移动是走三次,如果将棋盘二分图染色一下,不就是每一次只能走到另一个颜色的吗? 然 ...
- cogs750栅格网络流(最小割)
750. 栅格网络流 ★★☆ 输入文件:flowa.in 输出文件:flowa.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] Bob 觉得一般图的最大流问题太 ...
随机推荐
- FastDFS的简单使用
互联网中有海量的文件,比如电商网站有海量的图片文件,视频网站有海量的视频文件,如果使用传统的模式上传文件,肯定是不可取的.因此需要使用第三方服务器来存储图片 . 一.FastDFS简介 FastD ...
- 后缀数组 (Suffix Array) 学习笔记
\(\\\) 定义 介绍一些写法和数组的含义,首先要知道 字典序 . \(len\):字符串长度 \(s\):字符串数组,我们的字符串存储在 \(s[0]...s[len-1]\) 中. \(suff ...
- Spring---AOP注解开发&jdbc模板&Spring事务管理
一.AOP注解开发 此处需要回忆一遍AOP的概念.简单的来说,AOP就是利用动态代理技术,做到不触动源代码但却扩展了功能.那么就需要一个被扩展的对象和一个“新的功能”,例如说给某类的saveUser方 ...
- java中字节和字符的转换操作
package com.ywx.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputSt ...
- 重构29-Remove Middle Man(去掉中间人)
有时你的代码里可能会存在一些"Phantom"或"Ghost"类,Fowler称之为"中间人(Middle Man)".这些中间人类仅仅简单 ...
- rabiitmq
Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...
- 总结几点sql语句优化
一.表设计阶段: 1.主键的使用 a.业务日志表.安全审计表采用自增长: b.自定义编号用于业务流程类表,根据一定的编号规则: c.int型主键 用于基础数据表: 2.逻辑删除字段的 ...
- java io性能分析
摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...
- QPushButton注册事件过滤器后按钮消失
版权声明:本文为博主原创文章,转载需要注明出处. RT,代码如下: ui.btn_set->installEventFilter(this); bool MousrHoverTest::even ...
- docker 容器挂载主机目录,访问出现 cannot open directory /mnt/home/webroot/: Permission denied 的解决办法
问题原因及解决办法 原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题: 1.在运行容器的时候,给容器加特权,及加上 --privileged= ...