当前位置: 首页 > news >正文

【LeetCode】3655. 区间乘法查询后的异或 II (差分/商分 + 根号算法)

3655. 区间乘法查询后的异或 II

题目:

思路:

其实像这种根号算法有个很显然的特征,就是会有一个类似跳跃的功能,如每隔 k 格跳一次 

本题不难看出可以使用根号算法讨论,先来看看简单的暴力

对于暴力部分我们直接模拟即可,那么一次询问的时间复杂度为 O(n / k),即跳跃这么多次

那么对于非暴力做法怎么写呢?我们先假设 k = 1,对于区间操作,我们不难想到一个做法,即差分数组,那么本题我们可以类比差分,我们可以做一个 “商分”

具体的,我们初始每一个数初始化为 1,那么每一个位置就是从加变成了乘,依次递推过去即可,而原来的减法我们就要变成除法,但是显然直接除是不行的,注意到题目中要取模,所以我们可以考虑使用乘以逆元的操作来代替除法

那么假如 k > 1 呢?那么我们还是一样的,只不过这次从 每次加一递推 变成了 每次加 k 的递推 了,具体的我们还是一样的乘法操作,但是 r 需要改变,我们在 k 等于 1 时是在 r 处加 1,而这里则是在最后一个合法位置加 k,其实也是类比 k = 1 的情况

那么如何计算呢?不难看出,我们只需要看看 r 需要往后退几格即可,减去这个数后加上 k 就是最后的 r 了

k > 1 的累加过程有点不一样,由于我们设置了间隔,那么我们每次的起点就要设置多个了,即设置 0 ~ k-1,否则就不能统计完所有的数的操作了

最后优化细节就是我们可以判断这个 k 有没有出现过,如果没出现那么就跳过,同时记得开一下 long long,防止运算中爆了

代码:

class Solution {
public:const int MOD = 1e9 + 7;long long qp(long long a, int b) {long long res = 1;a %= MOD;while (b) {if (b & 1)res = res * a % MOD;b >>= 1;a = a * a % MOD;}return res;}int xorAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {int B = sqrt(queries.size());int n = nums.size();vector<vector<int>> dif(B + 1);for (auto& q : queries) {long long l = q[0], r = q[1], k = q[2], v = q[3];if (k >= B) {for (int i = l; i <= r; i += k) {nums[i] = nums[i] * v % MOD;}} else {dif[k].resize(n+k,1);r = r - (r - l) % k + k;dif[k][l] = dif[k][l] * v % MOD;if (r < n)dif[k][r] = dif[k][r] * qp(v, MOD - 2) % MOD;}}for (int k = 1; k < B; k++) {if(dif[k].empty()) continue;for (int start = 0; start < k; start++) {long long sumdiff = 1;for (int i = start; i < n; i += k) {sumdiff = (sumdiff * dif[k][i]) % MOD;nums[i] = nums[i] * sumdiff % MOD;}}}return reduce(nums.begin(), nums.end(), 0, bit_xor());}
};

http://www.dtcms.com/a/339199.html

相关文章:

  • 部署Qwen-Image
  • 【AAOS】Android Automotive 16模拟器源码下载及编译
  • 【LeetCode题解】LeetCode 153. 寻找旋转排序数组中的最小值
  • HJ2 计算某字符出现次数
  • C语言关于函数传参和返回值的一些想法2(参数可修改的特殊情况)
  • 从数据孤岛到实时互联:Canal 驱动的系统间数据同步实战指南
  • 在职老D渗透日记day21:sqli-labs靶场通关(第27a关)get联合注入 过滤select和union “闭合
  • C# 13 与 .NET 9 跨平台开发实战(第一章:开发环境搭建与.NET概述)
  • Milvus 向量数据库中的索引类型
  • SQL 语句进阶实战:从基础查询到性能优化全指南
  • K8s命名空间:资源隔离与管理的核心
  • 轻量级milvus安装和应用示例
  • 一文精通 Swagger 在 .NET 中的全方位配置与应用
  • 软件测试-Selenium学习笔记
  • Dify-MCP服务创建案例
  • 循环高级综合练习①
  • 46 C++ STL模板库15-容器7-顺序容器-双端队列(deque)
  • 人工智能统一信息结构的挑战与前景
  • Vue3编程中更多常见书写错误场景
  • 使用OpenCV计算灰度图像的质心
  • 云原生堡垒机渗透测试场景
  • 所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
  • 微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态
  • 大模型微调RAG、LORA、强化学习
  • 如何使用VNC对openEuler系统进行远程图形化操作
  • Ubuntu Server 22.04 k8s部署服务较时,文件描述符超过限制的处理方法
  • RabbitMQ:SpringBoot+RabbitMQ 多消费者绑定同一队列
  • Node.js 在 Windows Server 上的离线部署方案
  • leetcode349. 两个数组的交集
  • 轻度娱乐浪潮下定制开发开源AI智能名片S2B2C商城小程序的机遇与策略