[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 ...
随机推荐
- mongodb 集群分片
分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量,这 ...
- NetFPGA-1G-CML Demo --- reference_router_nf1_cml
环境 deepin 15.4 vivado 15.2 ise 14.6 前期准备 Github Wiki链接:https://github.com/NetFPGA/NetFPGA-public/wik ...
- verilog学习笔记(1)_两个小module
第一个小module-ex_module module ex_module( input wire sclk,//声明模块的时候input变量一定是wire变量 input wire rst_n,// ...
- Tornado介绍及自定义组件
Tornado 的性能是相当优异的,因为它试图解决一个被称之为"C10k"问题,就是处理大于或等于一万的并发.一万呀,这可是不小的量 条件:处理器为 AMD Opteron, 主频 ...
- 自己写编程语言-m语言
一直对技术有很强的兴趣,终于,决定要写自己的语言(m语言).那就先从最简单的开始:解释执行器. 一套完整的语言包含的肯定不止解释执行器了,还要有编译器和IDE,也就还要有语法高亮.智能提示等,不过还没 ...
- Node入门教程(2)第一章:NodeJS 概述
Node 概述 什么是 Node Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- 02-移动端开发教程-CSS3新特性(中)
1. 新的背景 背景在CSS3中也得到很大程度的增强,比如背景图片尺寸.背景裁切区域.背景定位参照点.多重背景等. 1.1 background-size设置背景图片的尺寸 cover会自动调整缩放比 ...
- python 学习笔记
1. 关于两者详细解释,参考链接:www.crifan.com/python_re_search_vs_re_findall/ 代码图
- phalcon框架命名空间
命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...
- angular4学习笔记整理(二)angular4的路由使用
这章说一下angular的路由 先说angular路由怎么引入,一开始new出来的angular项目它路由帮你配好了,但看要看app.module.ts里面 1.首先最上面要引入路由模块 import ...