BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3571
https://www.luogu.org/problemnew/show/P3236
小T准备在家里摆放几幅画,为此他买来了N幅画和N个画框。为了体现他的品味,小T希望能合理地搭配画与画框,使得其显得既不过于平庸也不太违和。对于第 幅画与第 个画框的配对,小T都给出了这个配对的平凡度Aij 与违和度Bij 。整个搭配方案的总体不和谐度为每对画与画框平凡度之和与每对画与画框违和度的乘积。具体来说,设搭配方案中第i幅画与第Pi个画框配对,则总体不和谐度为
小T希望知道通过搭配能得到的最小的总体不和谐度是多少。
我能说我debug 1h才发现j打成i了吗TAT
对于最小代价二分图匹配可以KM算法做(当然费用流是可以的但是O(玄学)对吧……)。
这个所求表达式形式像极了最小乘积生成树:BZOJ2395:[Balkan 2011]Timeismoney
所以其实我们只是把生成树部分变成KM就行啦!
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
const int INF=0x3f3f3f3f;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct point{
int x,y;
point(int xx=,int yy=){x=xx,y=yy;}
point operator -(const point &b)const{
return point(x-b.x,y-b.y);
}
int operator *(const point &b)const{
return x*b.y-y*b.x;
}
};
int n,ans,a[N][N],b[N][N];
int dis[N][N],wx[N],wy[N],match[N],sla[N];
bool vx[N],vy[N];
bool dfs(int u){
vx[u]=;
for(int v=;v<=n;v++){
if(!vy[v]){
int w=wx[u]+wy[v]-dis[u][v];
if(!w){
vy[v]=;
if(!match[v]||dfs(match[v])){
match[v]=u;return ;
}
}else sla[v]=min(sla[v],w);
}
}
return ;
}
point KM(){
point res=point(,);
memset(wx,,sizeof(wx));
memset(wy,,sizeof(wy));
memset(match,,sizeof(match));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
wx[i]=max(wx[i],dis[i][j]);
for(int i=;i<=n;i++){
memset(sla,INF,sizeof(sla));
while(){
memset(vx,,sizeof(vx));
memset(vy,,sizeof(vy));
if(dfs(i))break;
int minn=INF;
for(int j=;j<=n;j++)
if(!vy[j])minn=min(minn,sla[j]);
for(int j=;j<=n;j++){
if(vx[j])wx[j]-=minn;
if(vy[j])wy[j]+=minn;
else sla[j]-=minn;
}
}
}
for(int i=;i<=n;i++)
res.x+=a[match[i]][i],res.y+=b[match[i]][i];
ans=min(ans,res.x*res.y);
return res;
}
void work(point l,point r){
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=-(a[i][j]*(l.y-r.y)+b[i][j]*(r.x-l.x));
point mid=KM();
if((r-l)*(mid-l)>=)return;
work(l,mid);work(mid,r);
}
int main(){
int t=read();
while(t--){
ans=INF;n=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
a[i][j]=read();
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
b[i][j]=read();
for(int i=;i<=n;i++)for(int j=;j<=n;j++)dis[i][j]=-a[i][j];
point p1=KM();
for(int i=;i<=n;i++)for(int j=;j<=n;j++)dis[i][j]=-b[i][j];
point p2=KM();
work(p1,p2);
printf("%d\n",ans);
}
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ3571 & 洛谷3236:[HNOI2014]画框——题解的更多相关文章
- 洛谷P3236 [HNOI2014]画框(最小乘积KM)
题面 传送门 题解 我似乎连\(KM\)都不会打啊→_→ 和bzoj2395是一样的,只不过把最小生成树换成\(KM\)了.因为\(KM\)跑的是最大权值所以取个反就行了 //minamoto #in ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
随机推荐
- PostFix支持SMTP认证
安装cyrus-sasl yum -y install cyrus-sasl* 启动服务,开机启动 service saslauthd start chkconfig saslauthd on 配置p ...
- git 操作几个命令
git clone ssh://lijianfeng@192.168.1.246:29418/GMGameSDK压栈:git stash查状态:git status切换到要修改的提交:git reb ...
- lesson 17 The longest suspension bridge in the world
lesson 17 The longest suspension bridge in the world agreeable adj. 令人愉快的:适合的 = pleasant be located ...
- MVC数据的注册及验证简单总结
一.注解 注解是一种通用机制,可以用来向框架注入元数据,同时,框架不只驱动元数据的验证,还可以在生成显示和编辑模型的HTML标记时使用元数据. 二.验证注册的使用 1.Require:属性为Null或 ...
- Siki_Unity_1-2_Unity5.2入门课程_进入Unity开发的奇幻世界_Roll A Ball
1-2 Unity5.2入门课程 进入Unity开发的奇幻世界 任务1:Roll A Ball项目简介 Unity官网的tutorial入门项目 方向键控制小球在平台上滚动,碰撞方块得分,消掉所有方块 ...
- Pyhton网络爬虫实例_豆瓣电影排行榜_BeautifulSoup4方法爬取
-----------------------------------------------------------学无止境------------------------------------- ...
- Python基础 之 list类-列表
list类-列表 一.list类的基本属性 1. 列表格式 li = [1, 12, 9, ", 10], "even"], "root", True ...
- 讯飞云 API 语音听写 python3 调用例程
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import requests import time import gzip import urllib imp ...
- Windows10系统tensorflow-gpu安装
准备工作 安装前请确保自己的显卡支持gpu加速,支持加速的gpu型号可在下面的链接中查询. https://www.geforce.com/hardware/technology/cuda/suppo ...
- Elasticsearch 排序插件的开发
直接观察到的几个问题 简单expression脚本的执行效率 > java 插件,10000条数据可以测试出1ms左右的差距. Es会不断调用newScript来创建"足够多" ...