BZOJ2695 保护古迹
非常带劲之计算几何
写的头晕= =
就是平面图转对偶图然后最小割
由于p非常小我们枚举所有保护状态然后割一下
建图真的烦 就是把区域划分出来看一下每一个古迹点是否被小区域包含【好像也可以写点定位】
然后我好像判左右叉积又双叒叕的写反了?
整个画出图来然后发现好像没建错图= = 然后把!删掉竟然过了= =于是愉快改成onright= =
区域划分就是双向直线然后每次找反向的极角的最近的就可以了 可以画个图大概就是这个样子

红的就是反向边 找的就是蓝色的 找一圈就一定会找回来
然后别忘了记录那个外边的无限平面
写起来带劲2333
//Love and Freedom.
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
#define inf 20021225
#define ll long long
#define db double
#define eps 1e-8
using namespace std;
#define mxm 200000
#define mxn 1100
struct poi
{
db x,y;
poi(){}
poi(db _x,db _y){x=_x,y=_y;}
};
typedef poi vec;
vec operator +(vec a,vec b){return vec(a.x+b.x,a.y+b.y);}
vec operator -(vec a,vec b){return vec(a.x-b.x,a.y-b.y);}
vec operator *(vec a,db b){return vec(a.x*b,a.y*b);}
db cross(vec a,vec b){return a.x*b.y-a.y*b.x;}
db value(vec a){return a.x*a.x-a.y*a.y;}
db len(vec a){return sqrt(a.x*a.x+a.y*a.y);}
struct line
{
poi p; vec v; db ang;
int x,y,w,another,flag;
line(){}
line(poi _p,vec _v){p=_p,v=_v,ang=atan2(v.y,v.x);flag=0;}
};
bool onright(poi p,line l){return cross(l.p+l.v-p,l.p-p)>0;}
vector<int> e[mxn];
poi spc[mxn],stk[mxn];
bool v[mxn],out[mxn];
int n,m,p,bel[mxn];
line li[mxm];
bool cmp(int a,int b)
{
return li[a].ang<li[b].ang||abs(li[a].ang-li[b].ang)<eps&&cross(li[a].v,li[b].v)>0;
}
void find(int tmp,int id)
{
memset(v,true,sizeof(v));
for(int i=1;i<=p;i++)
if(v[i]) v[i]=onright(spc[i],li[tmp]);
int start = li[tmp].x, now = li[tmp].y; li[tmp].flag=id;
db area = cross(stk[start],stk[now]);
do
{
vector<int>::iterator it = upper_bound(e[now].begin(),e[now].end(),li[tmp].another,cmp);
if(it==e[now].end()) it=e[now].begin();
//if(id==1) printf("===%d %lf %lf===\n",now,li[li[tmp].another].ang,li[*it].ang);
tmp =*it; now=li[tmp].y;
li[tmp].flag = id; area += cross(stk[li[tmp].x],stk[li[tmp].y]);
for(int i=1;i<=p;i++) if(v[i]) v[i]=onright(spc[i],li[tmp]);
}while(start!=now);
for(int i=1;i<=p;i++) if(v[i]) bel[i]=id;
if(area>0) out[id]=1;
}
int ed,blk;
struct Edge
{
int x,y,w;
Edge(){}
Edge(int _x,int _y,int _w){x=_x,y=_y,w=_w;}
}E[mxm];
int Ecnt;
int ans[mxn];
struct edge{int to,lt,f;};
struct maxflow
{
edge e[mxm];
int in[mxn],cnt=1,dis[mxn],s,t;
queue<int> que;
void init()
{
s=mxn-10; t=s+1; cnt=1;
memset(in,0,sizeof(in));
}
void add(int x,int y,int f)
{
e[++cnt].to=y;e[cnt].lt=in[x];e[cnt].f=f;in[x]=cnt;
e[++cnt].to=x;e[cnt].lt=in[y];e[cnt].f=0;in[y]=cnt;
}
bool bfs()
{
memset(dis,0,sizeof(dis));
while(!que.empty()) que.pop();
dis[s]=1; que.push(s);
while(!que.empty())
{
int x=que.front(); que.pop();
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to;
if(!dis[y]&&e[i].f)
dis[y]=dis[x]+1,que.push(y);
if(dis[t]) return true;
}
}
return false;
}
int dfs(int x,int flow)
{
if(x==t||!flow) return flow;
int cur = flow;
for(int i=in[x];i;i=e[i].lt)
{
int y=e[i].to;
if(dis[y]==dis[x]+1&&e[i].f)
{
int tmp=dfs(y,min(cur,e[i].f));
e[i].f-=tmp; e[i^1].f+=tmp;
cur-=tmp; if(!cur) return flow;
}
}
dis[x] = -1;
return flow-cur;
}
int dinic()
{
int ans=0;
while(bfs()) ans+=dfs(s,inf);
return ans;
}
int build(int state)
{
init(); int one=0;
for(int i=0;i<p;i++)
if(state>>i&1)
{
add(s,bel[i+1],inf);
one++;
}
for(int i=1;i<=Ecnt;i++)
{
int x=E[i].x,y=E[i].y,w=E[i].w;
if(out[x]) x=t;
if(out[y]) y=t;
add(x,y,w);
}
return one;
}
}flow;
int main()
{
int x,y,w;
scanf("%d%d%d",&p,&n,&m);
for(int i=1;i<=p;i++) scanf("%lf%lf",&spc[i].x,&spc[i].y);
for(int i=1;i<=n;i++) scanf("%lf%lf",&stk[i].x,&stk[i].y);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
li[++ed] = line(stk[x],stk[y]-stk[x]);
li[ed].x=x;li[ed].y=y;li[ed].w=w;
li[ed].another = ed+1;
e[x].push_back(ed);
li[++ed] = line(stk[y],stk[x]-stk[y]);
li[ed].x=y;li[ed].y=x;li[ed].w=w;
li[ed].another = ed-1;
e[y].push_back(ed);
}
for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end(),cmp);
for(int i=1;i<=ed;i++) if(!li[i].flag) find(i,++blk);
for(int i=1;i<=ed;i++) E[++Ecnt] = Edge(li[i].flag,li[li[i].another].flag,li[i].w);
//for(int i=1;i<=ed;i++) printf("%d %d\n",i,li[i].flag);
memset(ans,48,sizeof(ans));
int top=(1<<p);
//for(int i=1;i<=p;i++) printf("%d\n",bel[i]);
for(int i=1;i<top;i++)
{
int one=flow.build(i);
int tmp=flow.dinic();
//printf("===%d %d %d\n",i,one,tmp);
ans[one]=min(ans[one],tmp);
}
for(int i=p;i;i--) ans[i]=min(ans[i],ans[i+1]);
for(int i=1;i<=p;i++) printf("%d\n",ans[i]);
return 0;
}
BZOJ2695 保护古迹的更多相关文章
- BZOJ2965 : 保护古迹
首先要将这个图连通,方法是通过扫描线+set求出每个连通块最高的点上方的第一条边,然后向交点连边. 然后把边拆成两条双向边,每次找到一条没走过的边,找到极角排序后它的反向边的后继,直到回到这条边. 根 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- [NetworkFlow]网络流建模相关
流 网络流问题本质上是线性规划问题的应用之中的一个,线性规划问题的标准形式是给出一组等式约束和不等式约束.要求最优化一个线性函数. 在流问题中,变量以流量的形式出如今问题中,我们给出一个流网络(以有向 ...
- 最小割&网络流应用
重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...
- 为革命保护视力 --- 给 Visual Studio 换颜色
“为革命,保护视力,预防近视,眼保健操开始......” 这个应该是最老版本的眼保健操了,你听过? 一堆废话 且不说上面这个眼保健操到底有木有用,让眼睛放松下还是很有必要的,尤其是现在天天对着不是手机 ...
- Go语言实战 - revel框架教程之CSRF(跨站请求伪造)保护
CSRF是什么?请看这篇博文“浅谈CSRF攻击方式”,说的非常清楚. 现在做网站敢不防CSRF的我猜只有两种情况,一是没什么人访问,二是局域网应用.山坡网之前属于第一种情况,哈哈,所以至今没什么问题. ...
- 用JWT来保护我们的ASP.NET Core Web API
在上一篇博客中,自己动手写了一个Middleware来处理API的授权验证,现在就采用另外一种方式来处理这个授权验证的问题,毕竟现在也 有不少开源的东西可以用,今天用的是JWT. 什么是JWT呢?JW ...
- IBatisNet -- 保护你的配置文件及映射文件信息
通常情况下我们在使用IBatisNet的时候,配置文件和映射文件都是暴露在外的,如果能进入到服务器,那么你的程序的操作数据库的SQL语句,数据库连接字符串等信息都将很轻松的被看到,这样是很危险的.然而 ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
随机推荐
- 继续写高精!noip2012国王游戏。。。
国王游戏 题目描述: 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...
- [tyvj]P1939玉蟾宫[单调栈]
[tyvj]P1939 玉蟾宫 ——!x^n+y^n=z^n 背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 描述 这 ...
- Python_008(文件操作)
一.文件操作 1.只读操作 f = open("taibai.txt",mode = "r",encoding = "utf-8" s = ...
- java文件转码
完整项目带lib 参考 http://toyota2006.iteye.com/blog/540316 判断编码 package change; import info.monitorenter.cp ...
- JS replace方法
var str = '1abc2defg3hijk'; str.replace(/\d/g,function(a,b,c,d){ console.log("a:",a);// 匹配 ...
- rem布局及响应式布局
流式布局(100%布局)(可能:做的页面不是很美观)效果与弹性布局一样 不设置宽高:表示宽 auto 最外层:保证100% 等比例缩放的算法: 320/10 已知的一个比例 = 已知的宽/x ...
- jsc2019_qualD Classified
题目大意 给你一个有n个点的完全图 求一种方案是的给边染色后任何一点不能沿一种颜色的边走奇数条边回到这个点 要求颜色数最少 分析 考场上输出格式打错见祖宗... 我们每次找一个最大二分图将其染一个新颜 ...
- Note-Git:Git 笔记
ylbtech-Note-Git:Git 笔记 1.返回顶部 · Git 分支管理: 主干/master.热修正/hotfix.预生产/release.开发develop.个人1(个人.小团队)/f ...
- python之环境变量(测试环境可配置)
想要实现的结果是: 执行脚本时,带一个参数,由这个参数来决定测试环境(开发or测试),比如: python test.py dev 实现代码: 方式1 不用__getitem__方式: import ...
- Vagrant 手册之 Vagrantfile - 机器设置 config.vm
原文地址 配置的命名空间:config.vm config.vm 中的设置修改 Vagrant 管理的机器的配置. 1. 可用的设置项 config.vm.boot_timeout Vagrant 等 ...