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

news2024/10/7 10:23:38

链接: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;
}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

asp.net core mvc之 布局

一、布局是什么&#xff1f; 布局是把每个页面的公共部分&#xff0c;提取成一个布局页面&#xff08;头、导航、页脚&#xff09;。 二、默认布局 _Layout.cshtml 默认的布局是在 /Views/Shared 目录的 _Layout.cshtml文件。通常Shared目录中的视图都是公共视图。该目录下的…

部分背包问题【贪心算法】

部分背包问题是一种经典的贪心问题&#xff0c;物品可以取一部分&#xff0c;也就是可以随意拆分的物品。 算法思路&#xff1a; 用列表保存每个物品的价值及总重量、平均价值&#xff08;性价比&#xff09;。输入数据同时计算每种物品的平均价值。使用自定义的compare函数以…

PADS快速调整器件的位号

选择元器件&#xff0c; ctrlA 全选器件&#xff0c;右击菜单选择特性 如下三个信息&#xff0c;确认 配置标签信息&#xff0c;如图界面信息&#xff0c;点击应用&#xff0c;器件全部归位

Slax Linux 强化了会话管理和引导参数选项

导读Slax Linux 的创始人和维护者Tomas Matejicek 宣布 了他的微型和便携 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强和错误修复。 新的 Slax Linux 版本&#xff08;基于 Debian 的 12.1 版本和基于 Slackware 的 15.0.2 版本&#xff09;引入了在可写设备上运行发…

vue3 ref 与shallowRef reactive与shallowReactive

ref 给数据添加响应式&#xff0c;基本类型采用object.defineProperty进行数据劫持&#xff0c;对象类型是借助reactive 实现响应式&#xff0c;采用proxy 实现数据劫持&#xff0c;利用reflect进行源数据的操作 let country ref({count:20,names:[河南,山东,陕西],objs:{key…

AI大模型时代,开发工程师与项目管理者面对的机遇和挑战,文末送书3本

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

centos7 在线安装python3

在线安装命令 yum install -y python3 输入命令之后等待安装完成 查看版本 查看版本3 输入命令 python3 看到版本号为3.6.8 查看版本2 输入命令 python2 看到版本号为2.7.5

网络运维Day13

文章目录 部署web服务器部署虚拟机web1安装依赖包解压NGINX压缩包初始化编译编译安装查看验证配置动静分离 部署虚拟机web2安装依赖包解压NGINX压缩包初始化编译编译安装查看验证配置动静分离 配置NGINX七层代理测试健康检查功能 配置NGINX四层代理部署代理服务器 总结 部署web…

vue中cli组件如何自定义定义

目录 创建自定义组件 注册并使用自定义组件 注册组件&#xff1a; 在需要使用该组件的页面或父组件中注册并引入自定义组件。 使用 Props 传递数据 总结步骤&#xff1a; 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用…

RocketMQ底层通信机制

分布式系统各个角色间的通信效率很关键&#xff0c;通信效率的高低直接影响系统性能&#xff0c;基于Socket实现一个高效的TCP通信协议是很有挑战的&#xff0c;本节介绍RocketMQ是如何解决这个问题的。 1.Remoting模块 RocketMQ的通信相关代码在Remoting模块里&#xff0c;先…

Linkage Mapper 报错

1 . 错误提示&#xff1a;“No module named lm_config” 错误原因&#xff1a;**** 2.错误提示&#xff1a;“Cannot find an installation of Circuitscape in your Program Files directory.” 错误原因&#xff1a;***** 3. 错误提示&#xff1a;UnicodeEncodeError: ‘asc…

Windows 微PE WePE_64_V2.3 PE模式下启用账号和修改密码

启动PE后&#xff0c;进入桌面打开运行dism程序 选择带有系统的盘符&#xff08;默认选的是PE盘&#xff09;&#xff0c;然后打开会话 选择左侧工具箱&#xff0c;然后右侧找到账户管理 然后就可以对已有账号进行管理了 结束。

Java SE 封装、包、static关键字和代码块

1.封装 1.1封装的概念 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说 就是套壳屏蔽细节。 封装&#xff1a;将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细…

springboot-error

Invalid bound statement (not found): com.example.demo.mapper.UserMapper.findAll 一直报错&#xff0c;找不到相应的mapper文件。 排除以下原因之后&#xff0c;还是不对&#xff1a; https://blog.csdn.net/xxpxxpoo8/article/details/127548543 最后发现是因为我的mapp…

云原生实战课大纲

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

聊聊leetcode可包含重复数字的序列的《47. 全排列 II》中的vis标记函数

1 题目描述&#xff08;字节二面题目&#xff09; 2 代码 class Solution {List<List<Integer>>res;List<Integer>list;boolean[]used;public List<List<Integer>> permuteUnique(int[] nums) {resnew ArrayList<>();listnew ArrayList&l…

PHP中$_SERVER全局变量

在PHP中&#xff0c;$_SERVER 是一个全局数组变量&#xff0c;它包含了有关服务器和当前脚本的信息。$_SERVER 数组中的每个元素都是服务器环境的一个参数&#xff0c;如请求的方法、请求的 URI、客户端 IP 地址等。 PATH 系统环境变量的值&#xff0c;包含了多个目录的路径…

SaaS 电商设计 (三) 如何做大促压测

一.背景&目标 1.1 常见的压测场景 电商大促:一众各大厂的促销活动场景,如:淘宝率先推出的天猫双11,而后京东拉出的京东 618 .还是后续陆陆续续的一些年货节, 3.8 女神节等等.都属于一些常规的电商大促 票务抢购:常见的如承载咱们 80,90 青春回忆的 Jay 的演唱会,还有普罗…

Docker - 容器数据卷

Docker - 容器数据卷 什么是容器数据卷 等同于挂载&#xff0c;将容器内的目录地址指向于宿主机文件系统中 直接使用命令来挂载 -v docker run -it -v 主机目录:容器内目录# 测试 docker run -it -v /root:/home centos /bin/bash [rootiZ2zeg7mctvft5renx1qvbZ ~]# docker …

求最大公约数math.gcd()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 求最大公约数 math.gcd() [太阳]选择题 下列代码执行输出的结果是&#xff1f; import math print("【执行】print(math.gcd(6, 8))") print(math.gcd(6, 8)) print(&quo…