《深入浅出进阶篇》——空间换时间优化——P2671 求和

链接:https://www.luogu.com.cn/problem/P2671

上题干:

题目描述

一条狭长的纸带被均匀划分出了n个格子,格子编号从11到n。每个格子上都染了一种颜色colori​用[1,m]当中的一个整数表示),并且写了一个数字numberi​。

定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

  1. xyz是整数,x<y<z,y−x=z−y

  2. colorx=colorz

满足上述条件的三元组的分数规定为(x+z)×(numberx​+numberz​)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。

输入格式

第一行是用一个空格隔开的两个正整数n表式纸带上格子的个数,m表纸带上颜色的种类数。

第二行有n用空格隔开的正整数,第i数字number表纸带上编号为i格子上面写的数字。

第三行有n用空格隔开的正整数,第i数字color表纸带上编号为i格子染的颜色。

输出格式

一个整数,表示所求的纸带分数除以1000710007所得的余数。

输入输出样例

输入 #1复制

6 2
5 5 3 2 2 2
2 2 1 1 2 1

输出 #1复制

82

输入 #2复制

15 4
5 10 8 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 4 3 3 2 4 4 4 4 1 1 1

输出 #2复制

1388

说明/提示

【输入输出样例 1 说明】

纸带如题目描述中的图所示。

所有满足条件的三元组为: (1,3,5),(4,5,6)(1,3,5),(4,5,6)。

所以纸带的分数为(1+5)×(5+2)+(4+6)×(2+2)=42+40=82(1+5)×(5+2)+(4+6)×(2+2)=42+40=82。

对于第 11 组至第 22 组数据,1≤n≤100,1≤m≤5;

对于第33 组至第 44 组数据, 1≤n≤3000,1≤m≤100;

对于第 55 组至第66组数据, 1≤n≤100000,1≤m≤100000,且不存在出现次数超过20的颜色;

对 于 全 部 1010 组 数 据 , 1≤n≤100000,1≤m≤100000,1≤colori​≤m,1≤numberi​≤100000

从这道题里,我们可以学到很多东西。

因为每个格子的编号是从1开始的,所以我们定义两个数组,a【i】表示 第i个格子内的数字,

b【i】表示第i个格子的颜色。

然后,这道题给了我们一个三元组(x,y,z),三个编号为x,y,z的格子。

要求这个三元组满足下面两个条件:

第一个条件是,这个三元组内部是严格升序的,并且,y-x=z-y

严格升序都能理解,那么我们接下来研究一下y-x=z-y这个条件想表达什么。

首先呢,不难看出它是一个等差数列。即x,y,z满足等差性质

那么假设公差为d,则有:x+2d=z,因为2d是一个偶数,所以x必然与z共奇偶。

请把这条性质记住。我们为什么会想到这个呢?因为我们是站在枚举复杂度的角度来看的。

假设我们要找到所有满足条件的x,y,z,那么简单的三重枚举就行了,但是会超时。

所以我们必须要找出优化的枚举操作。并带着目的性去审视题目给的条件。

第二个条件是:在(x,y,z)中,编号x的格子颜色要等于,编号为z的格子的颜色

即b【x】=b【z】

足这两个条件的三元组就可以计入答案,

每一组合法的三元组对答案的贡献是(x+z)*(a【x】+a【z】)

那么这道题到这就结束了吗?

不,还远远没有。

因为以我们现在推出来的条件,我们需要每次枚举x,z的位置(复杂度为O(n^2)),并且判断x,z的奇偶性,颜色是否相同。

这样做仍然无法通过本题(没错就是这么变态)

所以我们还要优化,但是还有哪里能优化呢?我们已经优化了条件,但是你有没有想过,计算答案这个过程是可以优化的。

每一个合法的三元组对答案的贡献可以展开成:x*a【x】+x*a【z】+z*a【x】+z*a【y】

那么x对答案的贡献是什么呢?x*a【x】+x*a【z】

我们简化一下问题:不考虑颜色是否相同,只考虑奇偶性是否相同

假设一对合法三元组为(1,2,3)那么1对答案的贡献是 1*a【1】+1*a【3】;

然后枚举z,当x=1的时候,z可以是5,7,9,11,13......

所以1对答案的贡献就是:1*a【1】+1*a【3】)+(1*a【1】1*a【5】)+(1*a【1】+1*a【7】)......

假设z枚举到7为止,也就是说如果有4个条件相同的元素(1,3,5,7)那么

1对答案的贡献:    3* (1*a【1】)+a【3】+a【5】+a【7】

等价于: 2*(1*a【1】)+(a【1】+a【3】+a【5】+a【7】)

3对答案的贡献:    3*(3*a【3】)+ 3a【1】+3a【5】+3a【7】

等价于:    2*(3*a【3】)+ 3(a【1】+a【3】+a【5】+a【7】)

我们可以把这个化成i的时候的一般式子,即i对于答案的贡献是 ( 共奇偶的格子数-2)*a【1】+i*(所有的共奇偶的格子上的数字和)

那么把这个东西一般化呢?即 任何 i 对答案的贡献是 a【i】*(满足同一种条件的格子数-2)+i*(满足同一种条件的格子数上面的数字之和)

让我们回到我们的问题,合法的三元组必须满足颜色相同,奇偶相同的性质

所以我们可以同理推理出来: 任何i对答案的贡献都是 a【i】*(共奇偶,且共颜色 的格子的总个数-2)+i*(共奇偶,共颜色的格子上面的数字之和)

所以我们只需要提前算出,共奇偶且共颜色的每个格子上的数字之和,和共奇偶且共颜色的格子总数。

用一个数组来存《共奇偶且共颜色的每个格子上的数字之和》   那么就有前缀和式子: sum【颜色】【奇偶】+= 满足这个条件的格子上的数字

也就是 sum[b[i][i%2]+= a[i];

另一个数组来存《共奇偶且共颜色的格子总数》 有 桶排序 ans【颜色】【奇偶】++;

也就是ans[b[i]][i%2]++;

然后我们就可以线性地求答案了。

只需要枚举i=1~n,每次计算答案,然后取模就可以了 。

代码如下:


const int N = 1e5 + 10;
const int mod = 10007;
int sum, n, m;
int a[N], b[N];
int sum1[N][3];//同色同奇偶的个数
int num[N][3];//同色奇偶的编号和
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)cin >> a[i];//输入编号
	for (int i = 1; i <= n; i++)
	{
		cin >> b[i];
		sum1[b[i]][i % 2]++;
		num[b[i]][i % 2] = (num[b[i]][i % 2]+a[i]) % mod;
	}
	for (int i = 1; i <= n; i++)
	{ 
		sum = (sum+ i *( (sum1[b[i]][i % 2] - 2) * a[i]%mod + num[b[i]][i % 2]) )%mod;
	}
	cout << sum;
}


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

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

相关文章

arm2 day6

串口实现单个字符的收发 main.c uart4.c uart4.h

手机厂商参与“百模大战”,vivo发布蓝心大模型

在2023 vivo开发者大会上&#xff0c;vivo发布自研通用大模型矩阵——蓝心大模型&#xff0c;其中包含十亿、百亿、千亿三个参数量级的5款自研大模型&#xff0c;其中&#xff0c;10亿量级模型是主要面向端侧场景打造的专业文本大模型&#xff0c;具备本地化的文本总结、摘要等…

HTML设置标签栏的图标

添加此图标最简单的方法无需修改内容&#xff0c;只需按以下步骤操作即可&#xff1a; 1.准备一个 ico 格式的图标 2.将该图标命名为 favicon.ico 3.将图标文件置于index.html同级目录即可 为什么我的没有变化&#xff1f; 答曰&#xff1a;ShiftF5强制刷新一下网页就行了

湖南省第六届大学生测绘综合技能大赛 GIS 应用赛项

注意事项&#xff1a; ①确认试题编号正确后再开始作答。 ②所有图件需清晰可辨。 ③新建数值型字段设置数据类型为双精度&#xff0c;数字格式为数值&#xff0c;小数位数默认。 ④答卷中不能出现任何涉密信息&#xff0c;答卷文档转成PDF提交。 1.&#xff08;25 分&#xf…

Oracle数据库、实例、用户、表空间和表之间的关系

一、Oracle数据库中数据库、实例、用户、表空间和表&#xff08;索引、视图、存储过程、函数、对象等对象&#xff09;之间的关系。 1、Oracle的数据库是由一些物理文件组成&#xff1a;数据文件控制文件重做日志文件归档日志文件参数文件报警和跟踪日志文件备份文件。 2、实…

数据库 并发控制

多用户数据库系统&#xff1a;允许多个用户同时使用同一个数据库的数据库系统 交叉并发方式&#xff1a;在单处理机系统中&#xff0c;事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行 同时并发方式&#xff1a;在多处理机系统中&#xff0c;每个处理机可以运行一个…

云原生实战课大纲

1. 云原生是什么 原生应用&#xff08;java,pyrhon&#xff09; 上云的过程应用上云遇到的问题1.微服务的拆分 微服务的访问关系应用的架构云原生适合什么样的人去学具备什么样的前提条件云原生要学习什么docker k8s devlops server mesh jks k8s监控吧自己的微服务上云另…

【C语言】

C语言 1. C语言基础1.1 数据类型和占位符1.2 异或1.3 关键字1.4 const1.5 extern1.6 typedef1.7 static1.8 左值和右值1.9 位进行操作赋值 2. C指针3. 二维数组和指针4. 函数传递二维数组4.1 形参给出第二维的长度。4.2 形参声明为指向数组的指针。4.3 形参声明为指针的指针。 …

如何使用免费的 Vecteezy 旅行视频

网址&#xff1a;https://www.vecteezy.com/ Vecteezy 是一个提供免费和付费矢量图形、模板、视频和其他创意资源的网站。该网站拥有大量旅行视频&#xff0c;可用于各种目的&#xff0c;例如个人使用、商业用途或教育用途。 要下载 Vecteezy 的免费旅行视频&#xff0c;请按…

阿里云服务器u1和经济型e实例有什么区别?

阿里云服务器ECS经济型e实例和通用算力型u1实例有什么区别&#xff1f;如何选择&#xff1f;ECS经济型e实例是共享型云服务器&#xff0c;通用算力型u实例是企业级独享型云服务器&#xff0c;e实例性价比高&#xff0c;现在2核2G3M带宽一年99元&#xff0c;云服务器u1价格相对要…

什么是权限?(Linux篇)

前言 其实我们在学会运用一些简单的Linux指令之后&#xff0c;我们可以简单的用ls查看当前目录的文件有哪些啊&#xff0c;可以使用tree用树形结构查看目录&#xff0c;可以使用touch来创建文件&#xff0c;用mkdir创建目录&#xff0c;可以使用rm来删除目录和文件&#xff0c;…

C#,数值计算——多项式计算,Poly的计算方法与源程序

1 文本格式 using System; using System.Text; namespace Legalsoft.Truffer { /// <summary> /// operations on polynomials /// </summary> public class Poly { /// <summary> /// polynomial c[0]c[1]xc[2]x^2 ..…

高频SQL50题(基础题)-5

文章目录 主要内容一.SQL练习题1.602-好友申请&#xff1a;谁有最多的好友代码如下&#xff08;示例&#xff09;: 2.585-2016年的投资代码如下&#xff08;示例&#xff09;: 3.185-部门工资前三高的所有员工代码如下&#xff08;示例&#xff09;: 4.1667-修复表中的名字代码…

数据库恢复技术

事务 含义&#xff1a;用户定义的一个数据库操作序列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的工作单位 地位&#xff1a;恢复和控制并发的基本单位 区分事务和程序&#xff0c;一个程序中包含多个事务 定义事务 事务的开始与结束…

[linux网络实验] 多网卡绑定

聚合链路技术 什么是bonding 提供了一种将多个网络接口设备绑定到一个网络接口的方法。这可用于网络负载平衡和网络冗余&#xff1b; 实现将两个网卡虚拟成一个网卡。这种聚合设备看起来就像一个以太网接口设备。通俗地说&#xff0c;这意味着两个网卡拥有相同的 IP 地址&am…

PostgreSQL 机器学习插件 MADlib 安装与使用

MADlib 一个可以在数据库上运行的开源机器学习库&#xff0c;支持 PostgreSQL 和 Greenplum 等数据库&#xff1b;并提供了丰富的分析模型&#xff0c;包括回归分析&#xff0c;决策树&#xff0c;随机森林&#xff0c;贝叶斯分类&#xff0c;向量机&#xff0c;风险模型&#…

Leetcode刷题详解——黄金矿工

1. 题目链接&#xff1a;1219. 黄金矿工 2. 题目描述&#xff1a; 你要开发一座金矿&#xff0c;地质勘测学家已经探明了这座金矿中的资源分布&#xff0c;并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量&#xff1b;如果该单元格…

数据库表的设计——范式

目录 1. 设计数据表需要注意的点 2. 范式 2.1 范式简介 2.2 范式有哪些&#xff1f; 2.3 第一范式(1NF) 2.4 第二范式(2NF) 2.5 第三范式(3NF) 2.6 小结 1. 设计数据表需要注意的点 &#xff08;1&#xff09;首先要考虑设计这张表的用途&#xff0c;这张表都要存放什…

博捷芯BJCORE:国内划片机品牌优势

国内划片机品牌在半导体设备制造领域奋起直追&#xff0c;展现出以下几个优势&#xff1a; 1. 技术提升&#xff1a;国内划片机品牌在技术上持续取得突破&#xff0c;例如设备精准度和切割精度的提高&#xff0c;可以在短时间内完成大量加工&#xff0c;提高了生产效率。 2. 适…

【Python Opencv】Opencv画图形

文章目录 前言一、画图形1.1 画线1.2 画矩形1.3 画圆1.4 画椭圆1.5 添加文本 总结 前言 在计算机视觉和图像处理中&#xff0c;OpenCV不仅可以处理图像和视频&#xff0c;还提供了一组功能强大的工具&#xff0c;用于在图像上绘制各种形状和图形。这些功能使得我们能够在图像上…