A. Weird Sum

题目链接 : 

Problem - 1648A - Codeforces

题面 : 

 题意 : 

输入 n m (1≤n*m≤1e5) 和 n 行 m 列的矩阵 a,元素范围 [1,1e5]。
对于矩阵中的所有相同元素对,即满足 a[x1][y1] = a[x2][y2] 的元素对 (a[x1][y1], a[x2][y2]),把 abs(x1-x2) + abs(y1-y2) 加到答案中。
注意 (a,b) 和 (b,a) 只算一次。
输出答案。

思路:

1.结果在数组的横坐标和纵坐标的方向上是可以分离的,不影响;

2.将每一个数字相同的横坐标存进一个vector中,纵坐标一样处理,对于每个单独的vector(p) : 对于第i个数 : 对于p[i]左边有i个数,距离之和为 : (p[i]-p[0])+(p[i]-p[1])+...(p[i]-p[i-1]);
即 i * p[i] - (p[0]+p[1]+p[2]+...+p[i-1]); 

详情请看代码

代码 : 

全放一起 : 

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'

using namespace std;
typedef long long LL;
const int N = 1e5 + 10;

vector<vector<vector<int>>> res(100002, vector<vector<int>>(2, vector<int>()));
LL ans;

// 对于p[i]左边有i个数,距离之和为 : (p[i]-p[0])+(p[i]-p[1])+...(p[i]-p[i-1]);
// 即 i * p[i] - (p[0]+p[1]+p[2]+...+p[i-1]); 
void fac(vector<int>& p){
	LL sum = 0;
	for(int i=0;i<p.size();i++){
		ans += (1LL) * i * p[i] - sum;
		sum += p[i];
	}
}

inline void solve(){
	int n , m , x ; 
	cin >> n >> m;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin >> x;
			res[x][0].push_back(i); // 横坐标 
			res[x][1].push_back(j); // 纵坐标 
		}
	}
	for(auto& p : res){
		fac(p[0]);
		sort(p[1].begin(),p[1].end());
		fac(p[1]);
	}
	cout << ans << endl;
}
 
int main()
{
    int _ = 1;
    while(_ --) solve();
    return 0;
}

分开处理(性能更优):

#pragma GCC optimize(3)
#include<iostream>
#include<vector>
#include<algorithm>
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'


using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
vector<vector<int>> r(N, vector<int>()), c(N, vector<int>());
LL ans;

// 对于p[i]左边有i个数,距离之和为 : (p[i]-p[0])+(p[i]-p[1])+...(p[i]-p[i-1]);
// 即 i * p[i] - (p[0]+p[1]+p[2]+...+p[i-1]); 
LL fac(vector<int>& p) {
	LL sum = 0, ys = 0;
	for (int i = 0; i < p.size(); i++) {
		ys += (1LL) * i * p[i] - sum;
		sum += p[i];
	}
	return ys;
}

inline void solve() {
	int n, m; cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			int x; cin >> x;
			r[x].push_back(i); // 横坐标 
			c[x].push_back(j); // 纵坐标 
		}
	}
	for (auto& p : r) {
		ans += fac(p);
	}
	for (auto& p : c) {
		sort(p.begin(), p.end());
		ans += fac(p);
	}
	cout << ans << endl;
}

int main()
{
	IOS
	int _ = 1;
	while (_--) solve();
	return 0;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

P3371 【模板】单源最短路径(弱化版)

【模板】单源最短路径&#xff08;弱化版&#xff09; 题目背景 本题测试数据为随机数据&#xff0c;在考试中可能会出现构造数据让SPFA不通过&#xff0c;如有需要请移步 P4779。 题目描述 如题&#xff0c;给出一个有向图&#xff0c;请输出从某一点出发到所有点的最短路…

代码随想录Day45 动态规划13 LeetCode T1143最长公共子序列 T1135 不相交的线 T53最大子数组和

LeetCode T1143 最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 动规五部曲分析 1.确定dp数组的含义 这里dp数组的含义是结尾分别为i-1,j-1的text1和text2的最长公共子序列长度 至于为什么是i-1,j-1我之前已经说过了,这里再…

ABZ正交编码 - 异步电机常用的位置信息确定方式

什么是正交编码&#xff1f; ab正交编码器&#xff08;又名双通道增量式编码器&#xff09;&#xff0c;用于将线性移位转换为脉冲信号。通过监控脉冲的数目和两个信号的相对相位&#xff0c;用户可以跟踪旋转位置、旋转方向和速度。另外&#xff0c;第三个通道称为索引信号&am…

μC/OS-II---计时器管理2(os_tmr.c)

目录 获取计时器的名字获取计时器到期前剩余的时间查看计时器的状态 计时器是倒计时器&#xff0c;当计数器达到零时执行某个动作。用户通过回调函数提供这个动作。回调函数是用户声明的函数&#xff0c;在计时器到期时被调用。在回调函数中绝对不能进行阻塞调用&#xff08;例…

软件测试基础1:认识软件及测试

功能测试能力:具备对所有软件的功能进行质量验证。 1什么是软件 分类 应用软件系统软件 软件&#xff1a;控制计算机硬件工作的工具。 2软件基本组成 3软件产生过程 4什么是软件测试 软件测试&#xff1a;使用技术手段验证软件是否满足使用需求。 5软件测试目的 减少软件…

使用matlab制作声音采样率转换、播放以及显示的界面

利用matlab做一个声音采样率转换、播放以及显示的界面 大抵流程&#xff1a; 图形界面创建&#xff1a;使用figure函数创建名为“声音采样率转换”的图形界面&#xff0c;并设置了其位置和大小。 按钮和文本框&#xff1a;使用uicontrol函数创建了选择音频文件的按钮、显示当前…

工业数据的“最后一公里”怎么走?

随着工业互联网的迅猛发展&#xff0c;工业数据已经成为推动制造业转型升级的重要动力。然而&#xff0c;面对海量的工业数据&#xff0c;如何高效、准确地走过数据的“最后一公里”&#xff0c;成为制约企业发展的关键问题。本文将探讨工业数据“最后一公里”所面临的挑战&…

魔兽服务器学习-笔记(服务器部署、地图管理、DB、日志模块、任务模块、战斗模块)

文章目录 一、环境准备1&#xff09;依赖安装2&#xff09;源码下载和编译 二、生成数据信息1&#xff09;地图数据信息&#xff08;客户端信息&#xff09;2&#xff09;数据库信息 三、启动服务器四、日志模块五、数据库模块六、场景模块1&#xff09;地图管理2&#xff09;A…

如何在微信内置浏览器内抓包

文章目录 使用环境&工具使用步骤1、手机USB连接上电脑&#xff0c;打开USB调试2、解压adb工具的压缩包&#xff0c;使用该工具连接上手机3、开启微信抓包4、电脑上打开chrome内核的浏览器或edge浏览器 使用环境&工具 windows电脑 安卓手机 adb工具 USB数据线 使用步骤…

【已解决】git push send-pack: unexpected disconnect while reading sideband packet

解决办法&#xff1a;修改缓存大小 打开项目所在路径下的git目录 找到config文件&#xff0c;用记事本打开编辑。 添加如下内容并保存即可 [http] postBuffer 1048576000

每日一练:Python中实现将阳历转换为农历

农历是中国传统的农业历法&#xff0c;与阳历&#xff08;公历&#xff09;有所不同。在Python中&#xff0c;我们可以使用第三方库 lunardate 来实现阳历到农历的转换。以下是一个简单的示例&#xff0c;演示如何在Python中执行这个转换过程。 1.安装 lunardate 库 首先&…

VR全景:打造虚拟政务服务,打通服务群众“最后一公里”

大家对政务大厅的工作效率可能已经司空见惯&#xff0c;办事窗口少&#xff0c;而需要办理的群众和业务却很多&#xff0c;很多去政务大厅办理业务的&#xff0c;排队几个小时也是常有的。并且在传统政务服务中&#xff0c;办事流程一般都较为复杂、耗时长&#xff0c;往往需要…

基于SSM的宠物领养系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

高频CSS面试题

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 BFC 块级格式上下文(block format context)是页面一块独立的渲染区域&#xff0c;具有一套独立的渲染规则 内部的…

吊打Fast Request还免费? 这款插件真心好用!

今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;比Fast Request更好用并且完全免费&#xff01;三大亮点功能&#xff1a;写完代码IDEA内一键生成API文档&#xff1b;写完代码IDEA内一键调试&#xff0c;&#xff1b;生成API目录树&#xff0c;双击即可快速…

[RK3568][Android12.0]--- 系统自带预置第三方APK方法

Platform: RK3568 OS: Android 12.0 Kernel: 4.19 Rockchip默认提供了机制来预置第三方APK, 方法很简单&#xff1a; 1. 在device/rockchip/rk3568创建preinstall目录(如果要可卸载&#xff0c;那就创建preinstall_del目录) 2. 将你要预安装的APK放进此目录即可 preinstall 不…

wind版本elasticdump执行报错 unexpected token ‘ in json at

输入的格式不对&#xff1a; 之前&#xff0c;json格式不对&#xff1a; elasticdump --inputhttp://***:9200/d_*_news, --output/home/zyyt/es_data_bak/0714.json --searchBody{"query":{"bool":{"must":[{"term":{"languag…

【算法练习Day48】回文子串最长回文子序列

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 回文子串最长回文子序列总结…

SparkSQL自定义UDF函数

需求&#xff1a;员工id正常为8位&#xff0c;对于不满8位的员工id左侧用0补齐 import org.apache.spark.sql.{DataFrame, SparkSession}object DataSetCreate {def main(args: Array[String]): Unit {val spark SparkSession.builder().appName("test").master(&…

excel用RAND函数、或者RAND.NV函数生成随机数、这两个函数的区别

用RAND函数生成大于0小于1的随机数 插入-》函数&#xff1a; 选择RAND函数&#xff1a; 点击“继续”&#xff1a; 点击“确定”&#xff0c;就生成随机数了&#xff1a; 用RAND.NV函数生成一个大于0小于1的随机数 步骤跟RAND函数相同&#xff0c;只不过选择的是RAN…