算法原理

根据 \(\operatorname{Kruskal}\) 算法的运算规则,每次总是会把当前边权最小,且连接着本不连通的两个点的边选中。

而在这道题目中,位于同一行或列的边的边权大小一定是相同的,因此一定会接连选完这一行或列上所有可行的边。

思考过程

选择一行/列后,整个被选中的行/列上所有的点都位于同一个连通分量。

故选完至少一行和至少一列后,接下来构成生成树的过程中,一定保证只存在一个包含两个及以上节点的连通分量。

这是一个关键点,思考过程可以以这个点分成两部分。

  1. 在选完至少一行和一列之前,保证接下来选择的任何行/列,这一行/列上所有的边都会被选择。

  2. 而在选完至少一行和一列之后,对于即将被选择的一行来说,这一行上尚未被连接进最小生成树的点的个数 \(=\) 总的列数 \(-\) 已被选择的列数。而一条边在构建最小生成树时,只能将一个点与最小生成树连接起来。因此选择这一行能选择的边的条数,即等于这一行上尚未接入最小生成树的点的个数。即总列数 \(-\) 已被选择的列数。对于列来说同理。

因此总的算法思路就明确了:

  1. 首先将所有的边权值放到一起升序排列,注意记录一下这个边权是横边的边权还是纵边的边权,开一个 pair 存很方便(自动按照第一关键字为索引进行升序排序)。一遍 sort 进行排序。开两个变量 \(l\text{(line)}\)、\(c\text{(column)}\) 存储已经选择的行/列数。

  2. 然后从小到大枚举排序后的边权,在两个统计变量都不为 \(0\) 之前,任何选的行/列都将其所包含的所有边全部加入最小生成树。

  3. 在两个统计变量都大于 \(0\) 之后,对于行来说,加入其包括的 \(m-c\) 条边,即可保证这一行上所有的点全部加入最小生成树,且不会影响到之后的选择,故可以保证正确性。列同理。

Tips

  • 排序时把所有的边放在了一起,因此记得把数组开成两倍。
  • 不开 long long 见祖宗

代码:

#include<bits/stdc++.h>

#define LL long long

using namespace std;

const int Maxe = 3e5 + 5;
pair<LL, bool> a[Maxe << 1];
int n, m;
LL ans = 0;
int main()
{
scanf("%d%d", &n, &m);
for(register int i = 1; i <= n; ++i)
{
int x;
scanf("%d", &x);
a[i] = make_pair(x, false);
}
for(register int i = n + 1; i <= n + m; ++i)
{
int x;
scanf("%d", &x);
a[i] = make_pair(x, true);
}
sort(a + 1, a + n + m + 1);
int l = 0, c = 0;
for(register int i = 1; i <= n + m; ++i)
{
if(!a[i].second)
{
if((!l)||(!c))
{
ans += (long long)(m - 1) * a[i].first;
}
else
{
ans += (long long)(m - c) * a[i].first;
}
l++;
}
else
{
if((!l)||(!c))
{
ans += (long long)(n - 1) * a[i].first;
}
else
{
ans += (long long)(n - l) * a[i].first;
}
c++;
}
}
printf("%lld", ans);
return 0;
}

P5687 网格图的更多相关文章

  1. [CF963E]Circles of Waiting[高斯消元网格图优化+期望]

    题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ...

  2. WPF 背景网格图

    利用DrawingBrush来画出背景网格图 <DrawingBrush Viewport="0,0,80,80" ViewportUnits="Absolute& ...

  3. 【HDOJ6218】Bridge(线段树,set,网格图,连通性)

    题意:给定一张2×n的网格图,一开始矩阵所有相邻点之间有一条边 有q个询问,每次给出两个相邻的点的坐标,将其中的边删除或者添加,问如此操作之后整张图的割边数量     n,q<=2*10^5, ...

  4. LOJ 546: 「LibreOJ β Round #7」网格图

    题目传送门:LOJ #546. 题意简述: 题目说的很清楚了. 题解: 将不包含起点或障碍物的连续的行或列缩成一行或一列,不会影响答案. 处理过后,新的网格图的行数和列数最多为 \(2k + 3\). ...

  5. 图-最短路-dijkstra-0/1BFS-1368. 使网格图至少有一条有效路径的最小代价

    2020-03-01 22:59:59 问题描述: 给你一个 m x n 的网格图 grid . grid 中每个格子都有一个数字,对应着从该格子出发下一步走的方向. grid[i][j] 中的数字可 ...

  6. 【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)

    题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路 一开始每条道路都是堵塞的,堵塞即为不可经过.经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了 多次询问,询 ...

  7. Matlab-Octave中绘制网格图和等高线:mesh 和 surf

    x=linspace(-50, 50, 50); % 在x轴上取50点y=linspace(-25, 25, 25); % 在y轴上取25点[xx,yy]=meshgrid(x, y); % xx和y ...

  8. HDU 3036 Escape 网格图多人逃生 网络流||二分匹配 建图技巧

    题意: 每一个' . '有一个姑娘, E是出口,'.'是空地 , 'X' 是墙. 每秒钟每一个姑娘能够走一步(上下左右) 每秒钟每一个出口仅仅能出去一个人 给定n*m的地图, 时限T 问全部姑娘是否能 ...

  9. GridView(网格视图)+MotionEvent(触控事件)实现可以拖动排序的网格图

    1.一触碰,就回调onInterceptTouchEvent(MotionEvent ev)事件,每次的触碰都只回调一次,接着只要还没有放手,就一直回调onTouchEvent(MotionEvent ...

随机推荐

  1. List<bean> 转换成List<Map>

    //将listmap转换成list实体类 List<OaAttachment>list=new ArrayList<OaAttachment>(); if(Func.isNot ...

  2. web前台界面的两种验证方式

    JSON的全称是"JavaScript Object Notation",意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式. 第一种: 用户体 ...

  3. 详解CSS布局

    CSS页面布局允许我们拾取网页中的元素,并且控制它们相对正常布局流.周边元素.父容器或者主视口/窗口的位置.主要对文档流的改变进行布局.假设你已经掌握了CSS的选择器.属性和值,并且可能对布局有一定了 ...

  4. Docker容器技术--自定义网桥后的默认网卡名称

    新建docker虚拟网络命令 这里以172.18.0.1为例,名字为clusterdocker network create --subnet=172.18.0.0/16 cluster 当我们想新建 ...

  5. python-scrapy框架爬取某瓣电视剧信息--异步加载页面

    前期准备,首先要有python环境+scrapy环境+pycharm环境 一.建立爬虫所需的环境,在命令行输入: scrapy startproject doubantv #命名自定义就好 会生成一个 ...

  6. lua脚本简介

    Lua [1]  是一个小巧的脚本语言.它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ier ...

  7. 图解HTTP权威指南(四)| 代理

    作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络等. ...

  8. 一文搞懂Java引用拷贝、深拷贝、浅拷贝

    刷题.面试中,我们可能会遇到将一个对象的属性赋值到另一个对象的情况,这种情况就叫做拷贝.拷贝与Java内存结构息息相关,搞懂Java深浅拷贝是很必要的! 在对象的拷贝中,很多初学者可能搞不清到底是拷贝 ...

  9. 对象存储 COS 全新集成媒体处理功能

    根据<2020年中国网络视听发展研究报告>,截至2020年6月,我国网络视听用户规模达9.01亿,网民使用率95.8%.这表明视频行业已经成为新的流量洼地,而抖音.快手等视频平台的崛起也让 ...

  10. MongoDB按照嵌套数组中的map的某个key无法正常排序的问题

    前阵子同事有一个需求: 在一个数组嵌套map的结构中,首先按照map中的某个key进行筛选,再按照map中的某个key进行排序,但是奇怪的是数据总是乱序的. 再检查了代码和数据之后并没有发现什么错误, ...