BZOJ3571 : [Hnoi2014]画框
题目是要求最小乘积最小权匹配,
将一种方案看做一个二维点(x,y),x=a值的和,y=b值的和,所有方案中只有在下凸壳上的点才有可能成为最优解
首先要求出两端的方案l,r两个点
l就是a值的和最小的方案,
r就是b值的和最小的方案
然后递归work(l,r)即可得出所有在下凸壳上的点
work(l,r){
找到一个离lr这条直线最远的且靠近原点的点mid
如果l,mid,r构成下凸壳{
work(l,mid)
work(mid,r)
}
}
如何找mid?
把所有边边权设为(a[i],b[i])它lr直线垂线上的投影,再求普通的最小权匹配即可。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int inf=~0U>>2,N=150,M=100110;
struct P{int x,y;P(){x=y=0;}P(int _x,int _y){x=_x,y=_y;}P operator-(const P&a){return P(x-a.x,y-a.y);}}L,R;
inline int cross(P a,P b){return a.x*b.y-a.y*b.x;}
int n,m,i,j,w[N][N],wa[N][N],wb[N][N],test,ans;
int u[M],v[M],c[M],co[M],coa[M],cob[M],nxt[M],t,S,T,l,r,q[M],g[N],f[N],d[N];bool in[N];
inline void add(int x,int y,int z,int zo,int zoa,int zob){
u[++t]=x;v[t]=y;c[t]=z;co[t]=zo;coa[t]=zoa;cob[t]=zob;nxt[t]=g[x];g[x]=t;
u[++t]=y;v[t]=x;c[t]=0;co[t]=-zo;coa[t]=-zoa;cob[t]=-zob;nxt[t]=g[y];g[y]=t;
}
inline bool spfa(){
memset(d,127,sizeof d);d[S]=0;in[S]=1;l=r=M>>1;q[l]=S;
int x,i;
while(l<=r){
int x=q[l++];
if(x==T)continue;
for(i=g[x];i;i=nxt[i])if(c[i]&&co[i]+d[x]<d[v[i]]){
d[v[i]]=co[i]+d[x];f[v[i]]=i;
if(!in[v[i]]){
in[v[i]]=1;
if(d[v[i]]<d[q[l]])q[--l]=v[i];else q[++r]=v[i];
}
}
in[x]=0;
}
return d[T]<=inf;
}
inline P mincostflow(){
P p;t=1;S=0;T=n*2+1;
for(i=0;i<=T;i++)g[i]=in[i]=0;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)add(i,j+n,1,w[i][j],wa[i][j],wb[i][j]);
for(i=1;i<=n;i++)add(S,i,1,0,0,0),add(i+n,T,1,0,0,0);
while(spfa())for(i=T;i!=S;i=u[f[i]])--c[f[i]],++c[f[i]^1],p.x+=coa[f[i]],p.y+=cob[f[i]];
if(p.x*p.y<ans)ans=p.x*p.y;
return p;
}
void work(P l,P r){
P t=l-r;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)w[i][j]=cross(P(wa[i][j],wb[i][j]),t);
P mid=mincostflow();
if(cross(mid-l,r-mid)>0)work(l,mid),work(mid,r);
}
int solve(){
ans=~0U>>1;
scanf("%d",&n);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&wa[i][j]);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",&wb[i][j]);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)w[i][j]=wa[i][j];
L=mincostflow();
for(i=1;i<=n;i++)for(j=1;j<=n;j++)w[i][j]=wb[i][j];
R=mincostflow();
work(L,R);
printf("%d\n",ans);
}
int main(){
scanf("%d",&test);
while(test--)solve();
return 0;
}
BZOJ3571 : [Hnoi2014]画框的更多相关文章
- BZOJ3571 [Hnoi2014]画框 【分治 + KM算法】
题目链接 BZOJ3571 题解 如果知道最小乘积生成树,那么这种双权值乘积最小就是裸题了 将两权值和作为坐标,转化为二维坐标系下凸包上的点,然后不断划分分治就好了 这里求的是最小匹配值,每次找点套一 ...
- bzoj3571: [Hnoi2014]画框 最小乘积匹配+最小乘积XX总结,
思路大概同bzoj2395(传送门:http://www.cnblogs.com/DUXT/p/5739864.html),还是将每一种匹配方案的Σai看成x,Σbi看成y,然后将每种方案转化为平面上 ...
- 【LG3236】[HNOI2014]画框
[LG3236][HNOI2014]画框 题面 洛谷 题解 和这题一模一样. 将最小生成树换成\(KM\)即可. 关于复杂度,因为决策点肯定在凸包上,且\(n\)凸包的期望点数为\(\sqrt {\l ...
- BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...
- bzoj 3571: [Hnoi2014]画框
Description 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和.对于第 幅画与第 个画框的配对,小T都 ...
- [HNOI2014]画框
题目描述 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和. 对于第 幅画与第 个画框的配对,小T都给出了这个配 ...
- 【bzoj3751】 Hnoi2014—画框
http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...
- luogu P3236 [HNOI2014]画框
传送门 我们把一种方案的\(\sum a_{i,j}\)和\(\sum b_{i,j}\)看成点\((\sum a_{i,j},\sum b_{i,j})\),那么就只要求横纵坐标之积最小的点,类似于 ...
- BZOJ 3571 [Hnoi2014]画框(最小乘积完美匹配)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3571 [题目大意] 给出一张二分图,每条边上有a,b两个值,求完美匹配, 使得suma ...
随机推荐
- VS2010编译链接openssl静态库
最近工作需要使用一些加密算法.之前尝试过cryptopp以及polarssl,听说openssl中的加密模块特别全,并且特别好用.于是想尝试一下. 一.环境配置 下载openssl,我这里使用的是op ...
- [ruby on rails] 跟我学之(4)路由映射
前面<[ruby on rails] 跟我学之Hello World>提到,路由对应的文件是 config/routes.rb 实际上我们只是添加了一句代码: resources :pos ...
- Watering the Fields(irrigation)
#include <cstdio> #include <algorithm> struct edge{ int f,t,w; } ed[5000000]; int pl,n,c ...
- CSS3.0盒模型display:-webkit-box;的使用
box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典 的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没 ...
- Windows环境下的jekyll本地搭建
一.配置ruby环境 由于jekyll是用ruby语言写的一个静态网页生成工具,所以要搭建jekyll本地环境就需要先配置好ruby环境. 1)去官网下载Ruby:https://www.ruby-l ...
- JQuery $.ajax()方法详解
jQuery Ajax 参考手册 实例 通过 AJAX 加载一段文本: jQuery 代码: $(document).ready(function(){ $("#b01").cli ...
- js 基本介绍
ecma 对象 三个包类型 String ParseInt ParseDouble instanceof typeof Math 对象 Array Date RegExp -- bom对象 ...
- Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决
前天PHP7.0.0正式版发布了,有一些比较好的改进,官方也说速度比php5.6快了两倍,性能上有了很大提升,并且也发布了从php5.x向php7迁移的问题,所以今后php网站迁移后能够大幅度的提升网 ...
- Action返回类型
1.返回ascx页面return PartialView(); 2.Content(),返回文本ContentResultreturn Content("这是一段文本"); 3.J ...
- Hadoop 1.1.2 eclipse plugin 编译 win7 集成
Windows平台上使用ANT编译Hadoop Eclipse Plugin 一.准备工作: 1.安装JDK 下载页面:http://www.oracle.com/technetwork/java ...