传送门

我们把一种方案的\(\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. uoj#80 二分图最大权匹配

    题意:给定二分图,有边权,求最大边权匹配.边权非负. 解:KM算法求解最大权完备匹配. 完备匹配就是点数少的那一边每个点都有匹配. 为了让完备匹配与最大权匹配等价,我们添加若干条0边使之成为完全二分图 ...

  2. B1016. 部分A+B

    正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA.例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6. 现给定A.DA.B.DB,请编 ...

  3. tar压缩解压文件

    查看visualization1.5.tar.gz 压缩包里面的内容: $ tar -tf visualization1.5.tar.gz 解压指定文件JavascriptVisualRelease/ ...

  4. Luogu P2743 [USACO5.1]乐曲主题Musical Themes

    链接 \(Click\) \(Here\) 人生第一道后缀数组的题目.首先要对输入的串进行差分处理,差分后长度为(\(n - 1\))的相同子段就是原串中长度为\(n\)的相同(可变调)子段.求出来\ ...

  5. Linux里的eval命令

      这个命令之前没有用过,在网上查了一下资料,觉得人家写的很好,所以复制过来了. 标题:linux命令eval的用法 链接:http://blog.chinaunix.net/uid-21411227 ...

  6. css换行

    1. word-break:break-all;只对英文起作用,以字母作为换行依据 2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据 3. white-space: ...

  7. 图论分支-Tarjan初步-边双联通分量

    本来应该先说强连通分量,但是有一定的分配,所以这个在下一篇博客将会见到. 这个本想连点连通分量一起讲,但是量有点大,所以我就分两步讲. 我们先看定义 再来看看图解 很容易就能发现,只要将割边断掉,然后 ...

  8. Jz2440 环境安装

    目录 Jz2440 环境安装 Ubuntu 设置 烧写工具 交叉编译环境 使用说明 烧写特性 title: Jz2440 环境安装 tags: linux date: 2018-09-20 22:56 ...

  9. AI Accord.NET入门

    Accord.NET官网:http://accord-framework.net/index.html Accord.NET的Github页面:https://github.com/accord-ne ...

  10. Structured Streaming Programming Guide结构化流编程指南

    目录 Overview Quick Example Programming Model Basic Concepts Handling Event-time and Late Data Fault T ...