luogu P3236 [HNOI2014]画框
我们把一种方案的\(\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\)左侧,所以是要最小化
\]
\((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]画框的更多相关文章
- 洛谷P3236 [HNOI2014]画框(最小乘积KM)
题面 传送门 题解 我似乎连\(KM\)都不会打啊→_→ 和bzoj2395是一样的,只不过把最小生成树换成\(KM\)了.因为\(KM\)跑的是最大权值所以取个反就行了 //minamoto #in ...
- 【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都给出了这个配 ...
- Luogu 3233 [HNOI2014]世界树
BZOJ 3572 首先看出虚树,然后考虑如何$dp$. 我们先在处理出的虚树上$dp$一遍,处理出虚树上所有点距离最近的关键点(关键点一定在虚树上嘛). 具体来说,先搜一遍处理出每一个点的父亲到它的 ...
- BZOJ3571 : [Hnoi2014]画框
题目是要求最小乘积最小权匹配, 将一种方案看做一个二维点(x,y),x=a值的和,y=b值的和,所有方案中只有在下凸壳上的点才有可能成为最优解 首先要求出两端的方案l,r两个点 l就是a值的和最小的方 ...
- bzoj3571: [Hnoi2014]画框 最小乘积匹配+最小乘积XX总结,
思路大概同bzoj2395(传送门:http://www.cnblogs.com/DUXT/p/5739864.html),还是将每一种匹配方案的Σai看成x,Σbi看成y,然后将每种方案转化为平面上 ...
- luogu P3238 [HNOI2014]道路堵塞
传送门 这什么题啊,乱搞就算了,不知道SPFA已经死了吗 不对那个时候好像还没死 暴力就是删掉边后跑Dijkstra SPFA 然后稍微分析一下,可以发现题目中要求的不经过最短路某条边的路径,一定是先 ...
随机推荐
- Go实战--golang中使用JWT(JSON Web Token)
http://blog.csdn.net/wangshubo1989/article/details/74529333 之前写过关于golang中如何使用cookie的博客: 实战–go中使用cook ...
- 洛谷P1731 生日蛋糕
李煜东太神了啊啊啊啊啊! 生日蛋糕,著名搜索神题(还有虫食算). 当年的我30分.... 这哥们的程序0ms... 还有他的树网的核也巨TM神. 疯狂剪枝! DFS(int d, int s, int ...
- A1057. Stack
Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...
- 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?
在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...
- (转)ZooKeeper的Znode剖析
ZooKeeper的Znode剖析 https://blog.csdn.net/lihao21/article/details/51810395 根据节点的存活时间,可以对节点划分为持久节点和临时节点 ...
- prototype 与 proto的关系是什么:
__proto__是什么? 我们在这里简单地说下.每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto_ ...
- JS中的toString方法
JS中的所有对象都具有toString方法,它把一个变量隐式转换为字符串 Number类型的对象的toString()方法比较特殊,有默认模式和基模式两种 默认模式: 无论我们用什么表示法声明数字变量 ...
- JS模块化开发(三)——seaJs+grunt
1.seaJs直接构建存在的问题 由于模块之间的依赖require引用的是模块名,当多个js模块被合并成一个时,会由于找不到模块名而报错 2.seaJs+grunt开发 用到的插件:grunt-cmd ...
- python自动化开发-[第十四天]-javascript(续)
今日概要: 1.数据类型 2.函数function 3.BOM 4.DOM 1.运算符 算术运算符: + - * / % ++ -- 比较运算符: > >= < <= != = ...
- Spring_AOP 实现原理与 CGLIB 应用
转自:https://www.ibm.com/developerworks/cn/java/j-lo-springaopcglib/index.html AOP(Aspect Orient Progr ...