传送门

我们把一种方案的\(\sum a_{i,j}\)和\(\sum b_{i,j}\)看成点\((\sum a_{i,j},\sum b_{i,j})\),那么就只要求横纵坐标之积最小的点,类似于最小乘积生成树

首先跑出\(\sum a_{i,j}\)最小和\(\sum b_{i,j}\)最小的,得到的点记为\(A\)和\(B\),然后求一个在\(AB\)左侧,距离\(AB\)最远的点\(C\).这就相当于要最大化\(S_{\triangle ABC}=|\frac{\vec{AB}\times\vec{AC}}{2}|\),因为\(C\)在\(AB\)左侧,所以是要最小化

\[\begin{matrix}\vec{AB}\times\vec{AC} &= (x_B-x_A)*(y_C-y_A)-(y_B-y_A)*(x_C-x_A)\\ &= (x_B-x_A)*y_C+(y_A-y_B)*x_C+S\end{matrix}
\]

\((S为常数项)\)

所以把\((x_B-x_A)*b_{i,j}+(y_A-y_B)*a_{i,j}\)设为边权,跑KM就好了,如果找到这样的点就继续递归处理\(AC\)和\(CB\),注意如果叉积\(\ge 0\),那么不在左侧,退出

话说二分图最小权匹配只要边权取反就好了,我沙雕还把其他地方跟着改了,WA的捕星

#include<bits/stdc++.h>
#define LL long long
#define db double
#define il inline
#define re register using namespace std;
const int N=75;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,a[N][N],b[N][N],mat[N],va[N],vb[N],e[N][N],sl[N],pr[N];
bool v[N];
void xyl(int xx)
{
memset(sl,0x3f3f3f,sizeof(sl));
memset(v,0,sizeof(v));
memset(pr,0,sizeof(pr));
int p=0;
mat[p]=xx;
do
{
int x=mat[p],mi=sl[0],nxt;
v[p]=1;
for(int y=1;y<=n;++y)
if(!v[y])
{
if(sl[y]>va[x]+vb[y]-e[x][y]) sl[y]=va[x]+vb[y]-e[x][y],pr[y]=p;
if(mi>sl[y]) mi=sl[y],nxt=y;
}
for(int i=0;i<=n;++i)
{
if(v[i]) va[mat[i]]-=mi,vb[i]+=mi;
else sl[i]-=mi;
}
p=nxt;
}while(mat[p]);
while(p) mat[p]=mat[pr[p]],p=pr[p];
}
int ans;
void dc(int ax,int ay,int bx,int by)
{
if(ay<by||(ay==by&&ax>bx)) swap(ax,bx),swap(ay,by);
int cx=0,cy=0;
for(int i=1;i<=n;++i)
{
va[i]=vb[i]=0;
for(int j=1;j<=n;++j)
va[i]=max(va[i],e[i][j]=-((bx-ax)*b[i][j]+(ay-by)*a[i][j]));
}
memset(mat,0,sizeof(mat));
for(int i=1;i<=n;++i) xyl(i);
for(int j=1;j<=n;++j) cx+=a[mat[j]][j],cy+=b[mat[j]][j];
ans=min(ans,cx*cy);
if((bx-ax)*(cy-ay)-(by-ay)*(cx-ax)<0) dc(ax,ay,cx,cy),dc(cx,cy,bx,by);
} int main()
{
int T=rd();
while(T--)
{
n=rd();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
a[i][j]=rd();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
b[i][j]=rd();
int ax=0,ay=0,bx=0,by=0;
for(int i=1;i<=n;++i)
{
va[i]=vb[i]=0;
for(int j=1;j<=n;++j)
va[i]=max(va[i],e[i][j]=-a[i][j]);
}
memset(mat,0,sizeof(mat));
for(int i=1;i<=n;++i) xyl(i);
for(int j=1;j<=n;++j) ax+=a[mat[j]][j],ay+=b[mat[j]][j];
for(int i=1;i<=n;++i)
{
va[i]=vb[i]=0;
for(int j=1;j<=n;++j)
va[i]=max(va[i],e[i][j]=-b[i][j]);
}
memset(mat,0,sizeof(mat));
for(int i=1;i<=n;++i) xyl(i);
for(int j=1;j<=n;++j) bx+=a[mat[j]][j],by+=b[mat[j]][j];
ans=min(ax*ay,bx*by);
dc(ax,ay,bx,by);
printf("%d\n",ans);
}
return 0;
}

luogu P3236 [HNOI2014]画框的更多相关文章

  1. 洛谷P3236 [HNOI2014]画框(最小乘积KM)

    题面 传送门 题解 我似乎连\(KM\)都不会打啊→_→ 和bzoj2395是一样的,只不过把最小生成树换成\(KM\)了.因为\(KM\)跑的是最大权值所以取个反就行了 //minamoto #in ...

  2. 【LG3236】[HNOI2014]画框

    [LG3236][HNOI2014]画框 题面 洛谷 题解 和这题一模一样. 将最小生成树换成\(KM\)即可. 关于复杂度,因为决策点肯定在凸包上,且\(n\)凸包的期望点数为\(\sqrt {\l ...

  3. BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...

  4. bzoj 3571: [Hnoi2014]画框

    Description 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和.对于第 幅画与第 个画框的配对,小T都 ...

  5. [HNOI2014]画框

    题目描述 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和. 对于第 幅画与第 个画框的配对,小T都给出了这个配 ...

  6. Luogu 3233 [HNOI2014]世界树

    BZOJ 3572 首先看出虚树,然后考虑如何$dp$. 我们先在处理出的虚树上$dp$一遍,处理出虚树上所有点距离最近的关键点(关键点一定在虚树上嘛). 具体来说,先搜一遍处理出每一个点的父亲到它的 ...

  7. BZOJ3571 : [Hnoi2014]画框

    题目是要求最小乘积最小权匹配, 将一种方案看做一个二维点(x,y),x=a值的和,y=b值的和,所有方案中只有在下凸壳上的点才有可能成为最优解 首先要求出两端的方案l,r两个点 l就是a值的和最小的方 ...

  8. bzoj3571: [Hnoi2014]画框 最小乘积匹配+最小乘积XX总结,

    思路大概同bzoj2395(传送门:http://www.cnblogs.com/DUXT/p/5739864.html),还是将每一种匹配方案的Σai看成x,Σbi看成y,然后将每种方案转化为平面上 ...

  9. luogu P3238 [HNOI2014]道路堵塞

    传送门 这什么题啊,乱搞就算了,不知道SPFA已经死了吗 不对那个时候好像还没死 暴力就是删掉边后跑Dijkstra SPFA 然后稍微分析一下,可以发现题目中要求的不经过最短路某条边的路径,一定是先 ...

随机推荐

  1. Go实战--golang中使用JWT(JSON Web Token)

    http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...

  2. 洛谷P1731 生日蛋糕

    李煜东太神了啊啊啊啊啊! 生日蛋糕,著名搜索神题(还有虫食算). 当年的我30分.... 这哥们的程序0ms... 还有他的树网的核也巨TM神. 疯狂剪枝! DFS(int d, int s, int ...

  3. A1057. Stack

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  4. 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?

    在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...

  5. (转)ZooKeeper的Znode剖析

    ZooKeeper的Znode剖析 https://blog.csdn.net/lihao21/article/details/51810395 根据节点的存活时间,可以对节点划分为持久节点和临时节点 ...

  6. prototype 与 proto的关系是什么:

    __proto__是什么? 我们在这里简单地说下.每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto_ ...

  7. JS中的toString方法

    JS中的所有对象都具有toString方法,它把一个变量隐式转换为字符串 Number类型的对象的toString()方法比较特殊,有默认模式和基模式两种 默认模式: 无论我们用什么表示法声明数字变量 ...

  8. JS模块化开发(三)——seaJs+grunt

    1.seaJs直接构建存在的问题 由于模块之间的依赖require引用的是模块名,当多个js模块被合并成一个时,会由于找不到模块名而报错 2.seaJs+grunt开发 用到的插件:grunt-cmd ...

  9. python自动化开发-[第十四天]-javascript(续)

    今日概要: 1.数据类型 2.函数function 3.BOM 4.DOM 1.运算符 算术运算符: + - * / % ++ -- 比较运算符: > >= < <= != = ...

  10. Spring_AOP 实现原理与 CGLIB 应用

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html AOP(Aspect Orient Progr ...