Minimum grid

题意:

一个n * n的矩阵,有m个位置需要填数,填的数的范围是0<=k<=1e6,需要满足第i行的最大值是b,第j列的最大值是ci,求一个满足条件的最小代价
n<=2e3,m<=8e5,k<=1e6

题解:

如果直接填,我们需要满足每行每列的最大值,第i行最大值是a,第j行最大值是b,我们需要第i行单独有一个格子权值是a,第j行单独有一个格子的权值是b,这样代价是a+b,但是如果第i行和第j行的最大值都是a,我们可以直接在(i,j)这个格子上放a,这样即满足条件且代价降低(用一个a干了两个a的事)
如果现在第1行,第2行,第3行,第3列,第4列的最大值都是a,那么才怎么分配呢?我们把行放一侧,列放一侧,这不就是二分图吗,跑最大匹配即可,最大匹配就省下的a的数量。也就是(当前值对应的行数+当前值对应的列数-最大匹配值) * 当前值
当然前提是这几个位置都允许填
我们可以直接枚举最大值K,跑多次二分图,然后计算每次贡献得到答案
不过,每种权值互相不影响,可以建立多个二分图一次跑完

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;
//Fe~Jozky
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=3e3+9;
int a[maxn],b[maxn];
vector<int>g[maxn];
int match[maxn];
bool vis[maxn];
ll ans;
int n,m,k;
bool dfs(int x){for(int v:g[x]){if(vis[v])continue;vis[v]=1;if(!match[v]||dfs(match[v])){match[v]=x;return 1;}}return 0;
}
int main()
{cin>>n>>m>>k;for(int i=1;i<=n;i++)cin>>a[i];for(int j=1;j<=n;j++)cin>>b[j];while(m--){int x,y;cin>>x>>y;if(a[x]==b[y])//如果该行最大值等于列最大值 g[x].push_back(y);}for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));dfs(i);}for(int i=1;i<=n;i++)//没有优化的结果 ans+=a[i]+b[i];for(int i=1;i<=n;i++)if(match[i])ans-=b[i];//可以省掉b[i] cout<<ans;
}

Minimum grid相关推荐

  1. 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)

    题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...

  2. 2021牛客暑期多校训练营3 C Minimum grid 网络流 + 二分图匹配

    传送门 文章目录 题意: 思路: 题意: 给你一个n∗nn*nn∗n的矩阵,有mmm个点的位置需要填数,填的数范围是0≤k≤1e60\le k\le1e60≤k≤1e6,需要满足第iii行的最大值是b ...

  3. C. Minimum Grid Path(思维)

    昨天晚上写的时候看错题了,以为并不是交替走,最后没时间了读了一遍题目发现是交替走,然后就秒了但是已经没时间写了. 其实昨天并不想写,不过看了下D题发现是个数学题,虽然我数学题非常渣渣,但是拿起笔就推了 ...

  4. Educational Codeforces Round 106 (Rated for Div. 2) C. Minimum Grid Path 奇偶 + 思维

    传送门 文章目录 题意: 思路: 题意: 给一个二维平面,起点在(0,0)(0,0)(0,0),终点在(n,n)(n,n)(n,n),每次只能往上和往右走,距离随意,总步数不超过nnn,每一步有一个代 ...

  5. Educational Codeforces Round 106 (Rated for Div. 2)(A ~ E)题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 Educational Codeforces Round 106 (Rated for Div. ...

  6. 2021牛客暑期多校训练营3

    2021牛客暑期多校训练营3 题号 题目 知识点 A Guess and lies B Black and white C Minimum grid 二分图匹配 D Count E Math 数论+打 ...

  7. [CF/AT/Luogu]各大网站网赛 爆肝部部长工作报告文件Ⅱ

    文章目录 CodeForces LATOKEN-Round-1(Div.1+Div.2) A. Colour the Flag B. Histogram Ugliness C. Little Alaw ...

  8. JHChart 1.1.0 iOS图表工具库中文ReadMe

    代码地址如下: http://www.demodashi.com/demo/11701.html 好吧,的确当前的[github]上已经存有不少的iOS图表工具库,然而,当公司的项目需要图表时,几乎没 ...

  9. CUDA学习(二十九)

    占用率计算器: 有几个API函数可以帮助程序员根据寄存器和共享内存的要求来选择线程块大小: 占用计算器API cudaOccupancyMaxActiveBlocksPerMultiprocessor ...

最新文章

  1. 中国电信天翼Live究竟胜算几何?
  2. linux文件系统简介
  3. AJAX跨域资源共享 CORS 详解
  4. 运营,如何用数据说话?(以电商活动复盘为例)
  5. CNN卷积神经网络推导和实现
  6. 如何在linux环境下安装yaf
  7. limit实现原理 mysql_值得一生典藏:MySQL的事务实现原理
  8. 用计算机MR,计算机上的【MC、MR、M
  9. linux teaming状态命令,Linux 网卡Teaming
  10. matlab工作空间,变量的保存和载入
  11. IEEE745浮点数格式
  12. CSS权威指南(第三版)笔记
  13. 华为路由器的静态路由之间的等价路由以及浮动路由
  14. 《软件体系结构原理、方法与实践》第二版期末考试复习总结
  15. CST微波工作室学习笔记—14.天线设计实例
  16. Java 实现 图片OCR文字识别
  17. java seo优化_JavaWeb 项目如果从技术选型的角度来做 Seo 优化
  18. GitHub两天标星2.1K+!自动刷喵币靠这一个脚本就够了.....
  19. Geekon移动电源概念版
  20. 计算机组成原理第一章知识点总结

热门文章

  1. 刷题≠学好数学,近百位名校名师告诉你,数学是怎么学好的?
  2. 分布式之数据库和缓存双写一致性方案解析!
  3. 国庆中秋活动——读完这两套书,宝宝就变小小物理学家了!
  4. qt显示echart_Qt配置,载入html,Echart, 交互
  5. idea 配置jdk版本_JDK 11 安装过程(同时已安装了JDK 8)以及Intellij IDEA 配置
  6. 计算机视觉领域还有那些坑,深度学习/计算机视觉常见的8个错误总结及避坑指南...
  7. android 获取当前画布,Android硬件位图填坑之获取硬件画布
  8. c语言复数的运算实验报告,C语言复数的运算(实验报告).doc
  9. python elasticsearch查询_python 查询Elasticsearch的小例子
  10. leetcode24. 两两交换链表中的节点