[HNOI2014]画框
题目描述
小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框。为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和。
对于第 幅画与第 个画框的配对,小T都给出了这个配对的平凡度Aij 与违和度Bij 。整个搭配方案的总体不和谐度为每对画与画框平凡度之和与每对画与画框违和度的乘积。具体来说,设搭配方案中第i幅画与第Pi个画框配对,则总体不和谐度为
小T希望知道通过搭配能得到的最小的总体不和谐度是多少。
输入输出格式
输入格式:
输入文件第 行是一个正整数T ,表示数据组数,接下来是T组数据。对于每组数据,第
行是一个正整数N,表示有N对画和画框。第2到第N+1行,每行有N个非负整数,第i+1 行第j个数表示Aij
。第N+2到第2*N+1行,每行有N个非负整数,第i+N+1 行第j个数表示Bij 。
输出格式:
包含T!行,每行一个整数,表示最小的总体不和谐度
输入输出样例
说明
第1幅画搭配第3个画框,第2幅画搭配第1个画框,第3 幅画搭配第2个画框,则总体不和谐度为30
N<=70,T<=3,Aij<=200,Bij<=200
学了最小乘积生成树后发现这题很相似
只不过把生成树换成了KM
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long lol;
struct Node
{
lol x,y;
};
Node operator -(Node u,Node v)
{
return (Node){u.x-v.x,u.y-v.y};
}
Node operator +(Node u,Node v)
{
return (Node){u.x+v.x,u.y+v.y};
}
lol operator *(Node u,Node v)
{
return u.x*v.y-u.y*v.x;
}
lol a[][],b[][],c[][];
bool vis1[],vis2[];
lol E1[],E2[],n,match[],slack[];
lol ans;
bool dfs(int x)
{int i,j;
vis1[x]=;
for (i=;i<=n;i++)
if (vis2[i]==)
{
lol gap=E1[x]+E2[i]-c[x][i];
if (gap==)
{
vis2[i]=;
if (match[i]==-||dfs(match[i]))
{
match[i]=x;
return ;
}
}
else slack[i]=min(slack[i],gap);
}
return ;
}
Node KM()
{int i,j;
lol tmp;
memset(match,-,sizeof(match));
for (i=;i<=n;i++)
{
E2[i]=;
tmp=;
for (j=;j<=n;j++)
{
if (c[i][j]>tmp) tmp=c[i][j];
}
E1[i]=tmp;
}
for (i=;i<=n;i++)
{
for (j=;j<=n;j++)
slack[j]=1e15;
while ()
{
memset(vis1,,sizeof(vis1));
memset(vis2,,sizeof(vis2));
if (dfs(i)) break;
lol tmp=1e15;
for (j=;j<=n;j++)
if (vis2[j]==&&tmp>slack[j]) tmp=slack[j];
for (j=;j<=n;j++)
{
if (vis1[j]) E1[j]-=tmp;
if (vis2[j]) E2[j]+=tmp;
else slack[j]-=tmp;
}
}
}
lol ansa=,ansb=;
for (i=;i<=n;i++)
ansa+=a[match[i]][i],ansb+=b[match[i]][i];
return (Node){-ansa,-ansb};
}
lol cross(Node p,Node A,Node B)
{
return (A-p)*(B-p);
}
void solve(Node B,Node A)
{int i,j;
Node C;
lol x=(A.y-B.y),y=(B.x-A.x);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
c[i][j]=-a[i][j]*x-b[i][j]*y;
C=KM();
if (C.x*C.y<ans) ans=C.x*C.y;
if (cross(C,B,A)>=) return;
solve(B,C);
solve(C,A);
}
int main()
{Node A,B;
int i,j,T;
cin>>T;
while (T--)
{
cin>>n;
ans=2e9;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
scanf("%lld",&a[i][j]);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
scanf("%lld",&b[i][j]);
for (i=;i<=n;i++)
for (j=;j<=n;j++)
c[i][j]=-b[i][j];
A=KM();
if (A.x*A.y<ans) ans=A.x*A.y;
for (i=;i<=n;i++)
for (j=;j<=n;j++)
c[i][j]=-a[i][j];
B=KM();
if (B.x*B.y<ans) ans=B.x*B.y;
solve(B,A);
printf("%lld\n",ans);
}
}
[HNOI2014]画框的更多相关文章
- 【LG3236】[HNOI2014]画框
[LG3236][HNOI2014]画框 题面 洛谷 题解 和这题一模一样. 将最小生成树换成\(KM\)即可. 关于复杂度,因为决策点肯定在凸包上,且\(n\)凸包的期望点数为\(\sqrt {\l ...
- bzoj 3571: [Hnoi2014]画框
Description 小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框.为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和.对于第 幅画与第 个画框的配对,小T都 ...
- BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571 https://www.luogu.org/problemnew/show/P3236 小T ...
- 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 P3236 [HNOI2014]画框
传送门 我们把一种方案的\(\sum a_{i,j}\)和\(\sum b_{i,j}\)看成点\((\sum a_{i,j},\sum b_{i,j})\),那么就只要求横纵坐标之积最小的点,类似于 ...
- 【bzoj3751】 Hnoi2014—画框
http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...
- BZOJ 3571 [Hnoi2014]画框(最小乘积完美匹配)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3571 [题目大意] 给出一张二分图,每条边上有a,b两个值,求完美匹配, 使得suma ...
- 洛谷P3236 [HNOI2014]画框(最小乘积KM)
题面 传送门 题解 我似乎连\(KM\)都不会打啊→_→ 和bzoj2395是一样的,只不过把最小生成树换成\(KM\)了.因为\(KM\)跑的是最大权值所以取个反就行了 //minamoto #in ...
随机推荐
- python IDLE中反斜杠显示为人民币符号¥的解决办法
改换英文字体即可
- MySQL 自关联查询
定义表areas,结构如下 id atitle pid 因为省没有所属的省份,所以可以填写为null 城市所属的省份pid,填写省所对应的编号id 这就是自关联,表中的某一列,关联了这个表中的另外一列 ...
- salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值
注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...
- 有货前端 Web-APM 实践
有货前端 Web-APM 实践 0 背景 有货电商技术架构上采用的是前后端分离,前端是主要以业务展示和接口聚合为主,拥有自己的 BFF (Backend For Frontend),以 nodejs ...
- Django REST framework+Vue 打造生鲜超市(二)
三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow 图片处理 pip in ...
- 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTtful API
上一篇写的是使用静态基类方法的实现步骤: http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...
- Python内置函数(46)——format
英文文档: format(value[, format_spec]) Convert a value to a "formatted" representation, as con ...
- Angular 学习笔记 ( CDK - Observers )
<div class="projected-content-wrapper" (cdkObserveContent)="projectContentChanged( ...
- less初学手记
less语言学习手记 工具下载 在less学习中,我们都会需要随时编译我们的less文件,查看生成的css样式表是否正确,以及是否符合我们的要求.推荐一款编译软件供大家下载使用:koala,本软件支持 ...
- HTML的水平居中和垂直居中解决方案
水平居中:给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto; } 让绝对定位的div居中 div { position: a ...