题面

题解

这又是一种套路啊233

将\(\sum a_i\)和\(\sum b_i\)分别看做\(x\)和\(y\),投射到平面直角坐标系中,于是就是找\(xy\)最小的点

于是可以先找出\(x\)最小的点\(\mathrm{A}\)和\(y\)最小的点\(\mathrm{B}\),然后找到在\(\mathrm{AB}\)下方的最远的点\(\mathrm{C}\)

即\(\overrightarrow{\mathrm{AB}} \times \overrightarrow{\mathrm{AC}}\)最小
\[ \begin{aligned} \because \overrightarrow{\mathrm{AB}} \times \overrightarrow{\mathrm{AC}} &= (x_{\mathrm{B}} - x_{\mathrm{A}})(y_{\mathrm{C}} - y_{\mathrm{A}}) - (y_{\mathrm{B}} - y_{\mathrm{A}})(x_\mathrm{C} - x_\mathrm{A}) \\ &= (x_\mathrm B - x_\mathrm A) \times y_\mathrm C + (y_\mathrm A - y_\mathrm B) \times x_\mathrm C + y_\mathrm B x_\mathrm A - x_\mathrm B y_\mathrm A \end{aligned} \]
于是将权值改成\(\mathrm{g}[i][j] = (y_\mathrm A - y_\mathrm B) \times a[i][j] + (x_\mathrm B - x_\mathrm A)\times b[i][j]\),然后用\(\mathrm{KM}\)找出\(\mathrm C\)。

找到\(\mathrm C\)之后用叉积判断一下\(\mathrm C\)是不是在\(\mathrm{AB}\)的下方,如果是的话,就递归处理\(\mathrm{AC, CB}\)

复杂度\(\mathrm{O}(\)能过\()\)

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<climits>
#define RG register
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define clear(x, y) memset(x, y, sizeof(x))inline int read()
{int data = 0, w = 1; char ch = getchar();while(ch != '-' && (!isdigit(ch))) ch = getchar();if(ch == '-') w = -1, ch = getchar();while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar();return data * w;
}const int N(75);
int T, n, a[N][N], b[N][N], ans;
struct vector { int x, y; };
inline vector operator - (const vector &lhs, const vector &rhs){ return (vector) {lhs.x - rhs.x, lhs.y - rhs.y}; }
inline int operator * (const vector &lhs, const vector &rhs){ return lhs.x * rhs.y - lhs.y * rhs.x; }
int g[N][N], lx[N], ly[N], visx[N], visy[N], match[N];
bool hungary(int x)
{visx[x] = 1;for(RG int to = 1; to <= n; to++)if(!visy[to] && lx[x] + ly[to] == g[x][to]){visy[to] = true;if(!match[to] || hungary(match[to])) return (match[to] = x, true);}return false;
}void build(int valx, int valy)
{for(RG int i = 1; i <= n; i++) for(RG int j = 1; j <= n; j++)g[i][j] = -(valx * a[i][j] + valy * b[i][j]);
}vector KM()
{for(RG int i = 1; i <= n; i++)ly[i] = 0, lx[i] = *std::max_element(g[i] + 1, g[i] + n + 1);memset(match, 0, sizeof match);for(RG int x = 1; x <= n; x++)while(1){clear(visx, 0), clear(visy, 0);if(hungary(x)) break;int inc = INT_MAX;for(RG int i = 1; i <= n; i++) if(visx[i])for(RG int j = 1; j <= n; j++) if(!visy[j])inc = std::min(inc, lx[i] + ly[j] - g[i][j]);for(RG int i = 1; i <= n; i++) if(visx[i]) lx[i] -= inc;for(RG int i = 1; i <= n; i++) if(visy[i]) ly[i] += inc;}vector ans = (vector) {0, 0};for(RG int i = 1; i <= n; i++)ans.x += a[match[i]][i], ans.y += b[match[i]][i];return ans;
}void solve(const vector &A, const vector &B)
{build(A.y - B.y, B.x - A.x);vector C = KM(); ans = std::min(ans, C.x * C.y);if((B - A) * (C - A) >= 0) return;solve(A, C), solve(C, B);
}int main()
{T = read();while(T--){n = read();for(RG int i = 1; i <= n; i++)for(RG int j = 1; j <= n; j++)a[i][j] = read();for(RG int i = 1; i <= n; i++)for(RG int j = 1; j <= n; j++)b[i][j] = read();build(1, 0); vector A = KM();build(0, 1); vector B = KM();ans = std::min(A.x * A.y, B.x * B.y);solve(A, B); printf("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/cj-xxz/p/10395705.html

【HNOI2014】画框相关推荐

  1. BZOJ 3571: [Hnoi2014]画框

    3571: [Hnoi2014]画框 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 996  Solved: 561 [Submit][Status ...

  2. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  3. BZOJ3572: [Hnoi2014]世界树

    题解: 首先建出一颗虚树  对于虚树上的每个节点DP找出离得最近的关键节点的编号和距离 然后考虑一遍dfs 对于每条链上子树 我们倍增找到mid位置 然后mid以下的属于下面节点 mid以上的属于上面 ...

  4. python对视频画框标记后保存

    参考链接: python-opencv-鼠标事件-画框圈定目标_Jason的博客-CSDN博客 # -*- coding: utf-8 -*-import cv2 import numpy as np ...

  5. python图片识别拉框_python目标检测给图画框,bbox画到图上并保存案例

    我就废话不多说了,还是直接上代码吧! import os import xml.dom.minidom import cv2 as cv ImgPath = 'C:/Users/49691/Deskt ...

  6. opencv画框返回坐标 python_python opencv鼠标事件实现画框圈定目标获取坐标信息

    本文实例为大家分享了python-opencv鼠标事件画框圈定目标的具体代码,供大家参考,具体内容如下 在视频/相机中,用鼠标画矩形框,圈定目标,从而获得鼠标的起始坐标点a.终止坐标点b # -*- ...

  7. SAP LIST 画框的FORM

    SAP LIST 画框的FORM,使得SAP Write画框变得简单.

  8. 【转】SAP LIST 画框的FORM

    SAP LIST 画框的FORM,使得SAP Write画框变得简单.

  9. yunyang tensorflow-yolov3 Intel Realsense D435 (并发)使用locals()函数批量配置摄像头运行识别程序并画框(代码记录)(代码示例)

    文章目录 20191126 20191202-1 20191202-2 20191126 # -*- encoding: utf-8 -*- """ @File : te ...

最新文章

  1. 常识知识在AI不同领域应用的最新研究进展
  2. Android开发:利用Activity的Dialog风格完成弹出框设计
  3. ASP.NET中自动生成XML文件并通过XSLT显示在网页中的方法
  4. JAVA工具类-StrUtils
  5. 陕西西咸新区暨沣渭新区泾渭新区网上截图!
  6. 【JAVASCRIPT】javascript获取屏幕,浏览器,网页高度宽度
  7. 2020.07笔记本选购指南
  8. java 动态创建数据库和动态连接数据库
  9. 理解ThreadLocal(一)
  10. 国内自主研发的游戏引擎一览
  11. 一、MySQL整体架构
  12. 程序员和码农有什么差别?
  13. Latex 箭头上面写字母
  14. 19 《黑石头的爱与恨:煤的故事》 -豆瓣评分7.4
  15. 数学常识--数学符号常识
  16. 【SAS NOTE】substr字符串提取函数
  17. 企业为什么要进行数字化转型1.1——顺势而为谋发展
  18. jq input输入框失焦、聚焦
  19. uipath锚点的使用
  20. 数字档案管理系统解决方案 - 数字化档案建设方案

热门文章

  1. 电缆桥架的拉挤玻璃钢材质优势
  2. 虚拟目录继承根Web.Config的问题解决(转)
  3. three.js之性能监视器
  4. 其它综合-VMware虚拟机安装Ubuntu 19.04 版本
  5. 选择 Reac​​tJS 的五大理由
  6. 【框架】[Spring]XML配置实现AOP拦截-切点:JdkRegexpMethodPointcut
  7. 解决Maven报Plugin execution not covered by lifecycle configuration
  8. 注册用户模块 password bug
  9. ORACLE性能优化救生指南_21章 重做和归档的优化
  10. android 获取ListView内部Item高度