BZOJ 3630: [JLOI2014]镜面通道 (网络流 +计算几何)
水能流过的地方光都能达到
呵呵.jpg
那就是裸的最小割(割开上边界和下边界)了…
判矩形和圆相交的时候就用圆心对矩形求一次点到矩形的最近距离(类似KD树的预估函数).
CODE
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
template<typename T>inline void read(T &num) {
char ch; int flg=1;
while((ch=getchar())<'0'||ch>'9')if(ch=='-')flg=-flg;
for(num=0;ch>='0'&&ch<='9';num=num*10+ch-'0',ch=getchar());
num*=flg;
}
const int MAXN = 605;
const int MAXM = 1000005;
const int inf = 1e9;
struct edge { int to, nxt, c, w, C; }e[MAXM];
int n, m, S, T, cnt, fir[MAXN], info[MAXN];
inline void add(int u, int v, int cc) {
e[cnt] = (edge){ v, fir[u], cc }, fir[u] = cnt++;
e[cnt] = (edge){ u, fir[v], 0 }, fir[v] = cnt++;
}
namespace SAP {
int h[MAXN], gap[MAXN], sz;
int aug(int u, int Max) {
if(u == T) return Max;
int flow = 0, delta, v;
for(int i = info[u]; ~i; i = e[i].nxt)
if(e[i].c && h[v=e[i].to]+1 == h[u]) {
delta = aug(v, min(Max-flow, e[i].c));
e[i].c -= delta, e[i^1].c += delta; info[u] = i;
if((flow+=delta) == Max || h[S] == sz) return flow;
}
if(!(--gap[h[u]])) h[S] = sz;
++gap[++h[u]]; info[u] = fir[u];
return flow;
}
inline int sap() {
memcpy(info, fir, sizeof fir);
int flow = 0; sz = T;
while(h[S] < sz)
flow += aug(S, inf);
return flow;
}
}
int X, Y, a[305], b[305], c[305], d[305], tp[305];
inline bool up(int i) {
if(tp[i] == 1) return b[i]+c[i] >= Y && b[i]-c[i] <= Y;
return d[i] >= Y && b[i] <= Y;
}
inline bool down(int i) {
if(tp[i] == 1) return b[i]+c[i] >= 0 && b[i]-c[i] <= 0;
return d[i] >= 0 && b[i] <= 0;
}
inline long long sqr(int x) { return 1ll * x * x; }
inline bool meet(int i, int j) {
if(tp[i] == tp[j]) {
if(tp[i] == 1) return sqr(a[i]-a[j]) + sqr(b[i]-b[j]) <= sqr(c[i]+c[j]);
return !(a[i] > b[j] || a[j] > b[i] || c[i] > d[j] || c[j] > d[i]);
}
if(tp[i] == 2) swap(i, j);
return sqr(max(a[i]-c[j], 0) + max(a[j]-a[i], 0)) + sqr(max(b[i]-d[j], 0) + max(b[j]-b[i], 0)) <= sqr(c[i]);
}
int main () {
memset(fir, -1, sizeof fir);
read(X), read(Y), read(n);
for(int i = 1; i <= n; ++i) {
read(tp[i]), read(a[i]), read(b[i]), read(c[i]);
if(tp[i] == 2) read(d[i]);
}
S = 0, T = 2*n+1;
for(int i = 1; i <= n; ++i) add(i, i+n, 1);
for(int i = 1; i <= n; ++i) if(up(i)) add(S, i, inf);
for(int i = 1; i <= n; ++i) if(down(i)) add(i+n, T, inf);
for(int i = 1; i <= n; ++i)
for(int j = i+1; j <= n; ++j)
if(i != j && meet(i, j)) add(i+n, j, inf), add(j+n, i, inf);
printf("%d\n", SAP::sap());
}
BZOJ 3630: [JLOI2014]镜面通道 (网络流 +计算几何)的更多相关文章
- 【bzoj3630】[JLOI2014]镜面通道 对偶图+计算几何+网络流最小割
题目描述 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表面为镜面的光学元件,光学元件α为圆形,光学元件β为矩形(这些元件 ...
- [bzoj3630][JLOI2014]镜面通道_计算几何_网络流_最小割
镜面通道 bzoj-3630 JLOI-2014 题目大意:题目链接. 注释:略. 想法: 我们发现,只要上下界没有被完全封死,我们就一定有一条合法的光路. 所以只需要将上界和下界拆开即可. 拆点,把 ...
- 【BZOJ3630】[JLOI2014]镜面通道 几何+最小割
[BZOJ3630][JLOI2014]镜面通道 Description 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表 ...
- BZOJ3630 : [JLOI2014]镜面通道
从左边不能到达右边当且仅当存在一条与上下底边相连的分割线将它们分开 设下底边为S,上底边为T,每个元件作为点,有公共部分的两个点互相连边 最后拆点求最小割 #include<cstdio> ...
- POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流)
POJ 2711 Leapin' Lizards / HDU 2732 Leapin' Lizards / BZOJ 1066 [SCOI2007]蜥蜴(网络流,最大流) Description Yo ...
- BZOJ 1565 [NOI2009]植物大战僵尸 | 网络流
传送门 BZOJ 1565 题解 这道题也是个经典的最大权闭合子图-- 复习一下最大权闭合子图是什么? 就是一个DAG上,每个点有个或正或负的点权,有的点依赖于另外一些点(如果选这个点,则被依赖点必选 ...
- BZOJ 4873 [Shoi2017]寿司餐厅 | 网络流 最大权闭合子图
链接 BZOJ 4873 题解 当年的省选题--还记得蒟蒻的我Day1 20分滚粗-- 这道题是个最大权闭合子图的套路题.严重怀疑出题人就是先画好了图然后照着图编了个3000字的题面.和我喜欢的妹子当 ...
- bzoj 2406: 矩阵 上下界网络流判定
2406: 矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 138 Solved: 46[Submit][Status][Discuss] De ...
- Bzoj 1532: [POI2005]Kos-Dicing 二分,网络流
1532: [POI2005]Kos-Dicing Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1373 Solved: 444[Submit][St ...
随机推荐
- 怎样获取所有的script节点
1. 使用document.scripts; document.scripts instanceof HTMLCollection; // true 2. 使用 document.getElement ...
- hdu 6077多校签到
#include <iostream> #include <cstdio> using namespace std; ][]; int f(int pos) { ; ;i< ...
- 操作系统中堆(heap)与栈(stack)的区别
主要区别如下: 一.空间分配: 1.堆(操作系统):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表.PS:java中都是系统GC,程序员无法进行GC. 2.栈(操作 ...
- try,except,finally的用法
try,except,finally try...except形式:指定一个或多个异常处理器(异常子句).. 当在try子句中没有异常发生时,,异常处理器将不被执行. 当在try子句中有异常发生时,首 ...
- JPA自带findOne方法报错原因
是由于jdk8的原因,有可能和spring boot的版本也关系, 两种方式可选 注册,返回类是Optional<Girl>, Optional是jdk8自带的 @GetMapping(v ...
- 【python+beautifulsoup4】Beautifulsoup4
Beautiful soup将复杂HTML文档转换成一个复杂的属性结构,每个节点都是python对象,所有对象可归纳为4种Tag,NavigableString,BeautifulSoup,Comme ...
- shell脚本——数组
连续的变量 解决:变量过多的问题,在同一类变量中,不需要定义多个名字,而是以数组的方式来定义 定义数组: declare -I 定义整数 declare -a 定义数组 declare -A 定义嵌套 ...
- 解决织梦5.7添加新变量出现:Request var not allow!的办法
找到:根目录->include->common.inc.phpif( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_ ...
- java 项目坑记录
1. spring项目引入了lombok jar包,且已在类上面添加@Data注释,还是关联不到 get() 和 set() 方法 需要安装扩展包 如果在线安装失败,提示错误readtime out, ...
- LoadRunner(8)
一.脚本关联技术 引入: 打开WebTours首页,点击administration连接: 具有大量管理项,LR为了模拟一些特效设置的选项,实际项目中不存在. -> 选择第三项: Set LO ...