【BZOJ3630】[JLOI2014]镜面通道

Description

在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0)。通道中有n个外表面为镜面的光学元件,光学元件α为圆形,光学元件β为矩形(这些元件可以与其他元件和通道有交集,具体看下图)。光线可以在AB上任一点以任意角度射入通道,光线不会发生削弱。当出现元件与元件,元件和通道刚好接触的情况视为光线无法透过(比如两圆相切)。现在给出通道中所有元件的信息(α元件包括圆心坐标和半径xi,yi,ri,β元件包括左下角和右上角坐标x1,y1,x2,y2)

如上图,S到T便是一条合法线路。

当然,显然存在光线无法透过的情况,现在交给你一个艰巨的任务,请求出至少拿走多少个光学元件后,存在一条光线线路可以从CD射出。

下面举例说明:

现在假设,取走中间那个矩形,那么就可以构造出一条穿过通道的光路,如图中的S到T。

Input

第一行包含两个整数,x,y,表示C点坐标

第二行包含一个数字,n,表示有n个光学元件

接下来n行

第一个数字如果是1,表示元件α,后面会有三个整数xi,yi,ri分别表示圆心坐标和半径

第一个数字如果是2,表示元件β,后面会有四个整数x1,y1,x2,y2分别表示左下角和右上角坐标(矩形都平行,垂直于坐标轴)

Output

输出包含一行,至少需要拿走的光学元件个数m

Sample Input

1000 100
6
1 500 0 50
2 10 10 20 100
2 100 10 200 100
2 300 10 400 100
2 500 10 600 100
2 700 0 800 100

Sample Output

2

HINT

x<=100000,y<=1000,n<=300

题解:首先,有一个神奇的物理结论:水能通过的地方光就能通过。(本人物理渣~)

然后水能通过的条件是整个通道不被堵死,即在对偶图中,上界和下界不连通。于是最小割判定即可。

写了一大坨代码,自己都不敢调了,不过这题数据还真是水,居然1A了~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
const double eps=1e-10;
double X,Y;
int n,nr,nc,S,T,cnt,ans;
int to[400000],next[400000],val[400000],head[1000],d[1000];
queue<int> q;
struct rectangle
{double x1,y1,x2,y2;bool inside(double x,double y){return x>=x1&&x<=x2&&y>=y1&&y<=y2;}
}pr[310];
double dis(double x1,double y1,double x2,double y2)
{return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
struct circle
{double x,y,r;bool inside(double a,double b){return dis(a,b,x,y)<=r+eps;}bool xcross(double x1,double x2,double y1){double len=sqrt(r*r-(y-y1)*(y-y1));if((x+len>=x1&&x+len<=x2)||(x-len>=x1&&x-len<=x2))   return 1;return 0;}bool ycross(double x1,double y1,double y2){double len=sqrt(r*r-(x-x1)*(x-x1));if((y+len>=y1&&y+len<=y2)||(y-len>=y1&&y-len<=y2))  return 1;return 0;}
}pc[310];
inline int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
void add(int a,int b,int c)
{to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;
}
int dfs(int x,int mf)
{if(x==T) return mf;int i,temp=mf,k;for(i=head[x];i!=-1;i=next[i]){if(d[to[i]]==d[x]+1&&val[i]){k=dfs(to[i],min(temp,val[i]));if(!k)  d[to[i]]=0;val[i]-=k,val[i^1]+=k,temp-=k;if(!temp) break;}}return mf-temp;
}
int bfs()
{memset(d,0,sizeof(d));while(!q.empty())    q.pop();int i,u;q.push(S),d[S]=1;while(!q.empty()){u=q.front(),q.pop();for(i=head[u];i!=-1;i=next[i]){if(!d[to[i]]&&val[i]){d[to[i]]=d[u]+1;if(to[i]==T)   return 1;q.push(to[i]);}}}return 0;
}
int main()
{X=rd(),Y=rd(),n=rd();S=2*n+1,T=2*n+2;int i,j;memset(head,-1,sizeof(head));for(i=1;i<=n;i++){if(rd()==1)    pc[++nc].x=rd(),pc[nc].y=rd(),pc[nc].r=rd();else   pr[++nr].x1=rd(),pr[nr].y1=rd(),pr[nr].x2=rd(),pr[nr].y2=rd();}for(i=1;i<=nr;i++){for(j=i+1;j<=nr;j++){if(pr[j].inside(pr[i].x1,pr[i].y1)||pr[j].inside(pr[i].x1,pr[i].y2)||pr[j].inside(pr[i].x2,pr[i].y1)||pr[j].inside(pr[i].x2,pr[i].y2)||pr[i].inside(pr[j].x1,pr[j].y1)||pr[i].inside(pr[j].x1,pr[j].y2)||pr[i].inside(pr[j].x2,pr[j].y1)||pr[i].inside(pr[j].x2,pr[j].y2)||(pr[i].x1<=pr[j].x1&&pr[j].x2<=pr[i].x2&&pr[j].y1<=pr[i].y1&&pr[i].y2<=pr[j].y2)||(pr[j].x1<=pr[i].x1&&pr[i].x2<=pr[j].x2&&pr[i].y1<=pr[j].y1&&pr[j].y2<=pr[i].y2))  add(i+n,j,1<<30),add(j+n,i,1<<30);}}for(i=1;i<=nc;i++)for(j=i+1;j<=nc;j++)if(dis(pc[i].x,pc[i].y,pc[j].x,pc[j].y)<=pc[i].r+pc[j].r)   add(i+n+nr,j+nr,1<<30),add(j+nr+n,i+nr,1<<30);for(i=1;i<=nr;i++){for(j=1;j<=nc;j++){if(pr[i].inside(pc[j].x,pc[j].y)||pc[j].inside(pr[i].x1,pr[i].y1)||pc[j].inside(pr[i].x1,pr[i].y2)||pc[j].inside(pr[i].x2,pr[i].y1)||pc[j].inside(pr[i].x2,pr[i].y2)||pc[j].xcross(pr[i].x1,pr[i].x2,pr[i].y1)||pc[j].xcross(pr[i].x1,pr[i].x2,pr[i].y2)||pc[j].ycross(pr[i].x1,pr[i].y1,pr[i].y2)||pc[j].ycross(pr[i].x2,pr[i].y1,pr[i].y2))add(i+n,j+nr,1<<30),add(j+n+nr,i,1<<30);}}for(i=1;i<=nr;i++){add(i,i+n,1);if(pr[i].y2>=Y)  add(S,i,1<<30);if(pr[i].y1<=0)    add(i+n,T,1<<30);}for(i=1;i<=nc;i++){add(i+nr,i+nr+n,1);if(pc[i].y+pc[i].r>=Y)    add(S,i+nr,1<<30);if(pc[i].y-pc[i].r<=0) add(i+nr+n,T,1<<30);}while(bfs())   ans+=dfs(S,1<<30);printf("%d",ans);return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/7391493.html

【BZOJ3630】[JLOI2014]镜面通道 几何+最小割相关推荐

  1. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  2. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  3. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  4. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  5. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  6. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  7. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

  8. 最小割 ---- 集合冲突模型

    集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...

  9. BZOJ 2132 圈地计划(最小割)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2132 是 hydro 的 BZOJ ...

最新文章

  1. 平均14915元,2021 年 1 月程序员工资统计出炉
  2. vue树形结构html,怎么在vue中利用递归组件实现一个树形控件
  3. Linux下更好用的帮助命令—cheat
  4. iTween基础之Color(变换颜色)
  5. hdu 5093 二分匹配
  6. 微服务为什么离不开spring cloud?
  7. bigquery_如何在BigQuery中进行文本相似性搜索和文档聚类
  8. radar(nyoj287贪心)
  9. 花书+吴恩达深度学习(一)前馈神经网络(多层感知机 MLP)
  10. codevs 2651 孔子教学——同桌
  11. JDK1.4下载 JRE1.4下载
  12. 最新YYCMS影视源码_比米酷好用_模板超好看
  13. 微型四旋翼飞行器的设计与制作
  14. SKLEARN实例:【用随机森林回归填补缺失值】
  15. 相比传统软件服务,KGB知识图谱的进阶应用体现在哪里
  16. 最新彻底禁止win10自动更新
  17. 阿里云安全组已经开放端口但是服务器端口还是不能访问
  18. 平方和立方和公式推导
  19. 解决MERCURY弹出上网公告的窗口方法
  20. 香帅的北大金融学课笔记15 -- 大师投资智慧

热门文章

  1. cookie 跨域问题
  2. 大数据WEB阶段Mybatis(二)
  3. 【机器视觉】 measure_pos算子
  4. 【Qt】2D绘图之坐标系统
  5. 【ARM】ARM其它指令
  6. 【ARM】MRS MSR指令
  7. 【Protocol Buffer】Protocol Buffer入门教程(四):序列化和反序列化
  8. gitlens突然不显示了_损失百万!预防LED显示屏火灾隐患,从三方面入手
  9. python全栈开发要学些什么_如何迅速学习Python 全栈开发?
  10. 宏观 量子计算一句话