Remainder Problem(根号分治)

Educational Codeforces Round 71 (Rated for Div. 2)

F. Remainder Problem

题目链接


F. Remainder Problem

题意:

给你一个由 500000 500000 500000 个整数(编号从 1 1 1 500000 500000 500000 )组成的数组 a a a 。最初 a a a 中的所有元素都为零。

您必须对这个数组进行两种类型的查询:

  • 1 1 1 x x x y y y - a x a_x ax 增加 y y y
  • 2 2 2 x x x y y y - 计算 ∑ i ∈ R ( x , y ) a i \sum\limits_{i \in R(x, y)} a_i iR(x,y)ai ,其中 R ( x , y ) R(x, y) R(x,y) 是所有从 1 1 1 500000 500000 500000 有模 x x x 同余 y y y 的整数的集合。

你能处理所有的查询吗?

思路:

很好的一道根号分治题,类似的还有这道 F. Sum of Progression 。题解的F题

操作 1 1 1 好说,看操作 2 2 2 如何实现。发现其实就是求 ∑ a i ∗ x + y \sum a_{i*x+y} aix+y 形式的数,对这种形式,大佬说:
在这里插入图片描述

当步长 x x x 很大的时候,我们其实枚举不了几次就会到边界 n n n ,因此 x x x 很大的时候直接枚举。而当 x x x 比较小的时候,我们可以提前处理出结果。这里把起始位置为 j j j ,步长为 i i i 的这一系列位置上的数的和设为 s [ i ] [ j ] s[i][j] s[i][j],这样操作 1 1 1 修改的时候只需要枚举步长 i i i,给所有 s [ i ] [ x % i ] s[i][x\%i] s[i][x%i] y y y 就可以维护住了。

而这个分界点就取为 n \sqrt n n ,当 x ≥ n x\ge\sqrt n xn 时,就用第一种枚举求和的方式来算。否则就直接查询 s [ i ] [ j ] s[i][j] s[i][j]。这样每次暴力枚举的次数不会超过 n \sqrt n n ,而每次修改的时候维护 s s s 数组时枚举的步长也只需要枚举 n \sqrt n n 次。总的时间复杂度就是枚举的复杂度加上维护 s s s 数组的复杂度,总的复杂度不会超过 q n q\sqrt n qn

为什么分界点取为 n \sqrt n n ?证明只需要用均值不等式就可以了。最坏情况显然是要么操作 1 1 1 修改,要么操作 2 2 2 使用枚举方式查询答案。如果分界点选为 t t t 最优,假设操作 1 1 1 x x x 次,那么操作 2 2 2 q − x q-x qx 次。总的操作次数是 x ∗ t + ( q − x ) ∗ n t x*t+(q-x)*\frac nt xt+(qx)tn,因为算最坏的情况,因此需要 t = n t t=\frac nt t=tn,否则就会按着用时最多的操作 a l l i n all\ in all in,因此就有了 t = n t=\sqrt n t=n ,总的时间复杂度就是 x ∗ n + ( q − x ) ∗ n = q ∗ n x*\sqrt n+(q-x)*\sqrt n=q*\sqrt n xn +(qx)n =qn

code:

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int n=5e5;
const int sqn=710;int t,x,y;
ll a[n+5],s[sqn+5][sqn+5];//初值 步长int main(){int _;cin>>_;while(_--){scanf("%d%d%d",&t,&x,&y);if(t&1){a[x]+=y;for(int i=1;i<sqn;i++)s[i][x%i]+=y;}else {if(x>=sqn){ll ans=0;for(int i=y;i<=n;i+=x)ans+=a[i];printf("%lld\n",ans);}else {printf("%lld\n",s[x][y]);}}} return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot -【SmartInitializingSingleton】基础使用及应用场景

SmartInitializingSingleton 在继续深入探讨 SmartInitializingSingleton接口之前&#xff0c;让我们先了解一下 Spring Framework 的基本概念和背景。Spring Framework 是一个开源的 JavaEE&#xff08;Java Enterprise Edition&#xff09;全栈&#xff08;full-stack&#x…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块&#xff0c;点击“”&#xff0c;再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写&#xff0c;再点击下面的Finish 点Apply或OK均可 右键src…

网络设备和网络软件

文章目录 网络设备和网络软件网卡交换机交换机的三个主要功能交换机的工作原理第二层交换和第三层交换交换机的堆叠和级联 路由器路由器工作原理 网关网关的分类 无线接入点(AP)调制解调器网络软件 网络设备和网络软件 网卡 网络接口卡又称网络适配器&#xff0c;简称网卡。网…

MySQL数据库基础(十五):PyMySQL使用介绍

文章目录 PyMySQL使用介绍 一、为什么要学习PyMySQL 二、安装PyMySQL模块 三、PyMySQL的使用 1、导入 pymysql 包 2、创建连接对象 3、获取游标对象 4、pymysql完成数据的查询操作 5、pymysql完成对数据的增删改 PyMySQL使用介绍 提前安装MySQL数据库&#xff08;可以…

服务器防漏扫

什么是漏扫&#xff1f; 漏扫是漏洞扫描的简称。漏洞扫描是一种安全测试方法&#xff0c;用于发现计算机系统、网络或应用程序中的潜在漏洞和安全弱点。通过使用自动化工具或软件&#xff0c;漏洞扫描可以检测系统中存在的已知漏洞&#xff0c;并提供相关的报告和建议&#xf…

记阿里云mysql丢表丢数据的实践记录

第一时间挂工单&#xff0c;联系工程师指引&#xff0c;现在回过来想&#xff0c;第一时间要确认发生时间。 1.通过性能视图&#xff08;马后炮的总结&#xff0c;实际凭记忆恢复了三四次才找到数据&#xff09; 2.先恢复数据 通过Navicat工具&#xff0c;结构同步&#xff0…

【Docker】03 容器操作

文章目录 一、流转图二、基本操作2.1 查看本地容器进程2.2 启动容器2.2.1 交互式启动容器2.2.2 后台启动容器 2.3 进入容器2.4 停止启动重启容器2.5 退出容器2.6 删除容器2.7 提交容器&#xff08;打包成镜像&#xff09;2.8 拷贝文件2.8.1 拷贝容器内文件到宿主机2.8.2 拷贝宿…

[TCP] TCP/IP 基础知识词典(2)

我想统计一下&#xff0c;TCP/IP 尤其是TCP协议&#xff0c;能搜到的常见的问题&#xff0c;整理起来&#xff0c;关键词添加在目录中&#xff0c;便于以后查阅。 目前预计整理共3篇&#xff1a; [TCP] TCP/IP 基础知识问答 &#xff1a;基础知识 [TCP] TCP/IP 基础知识问答&…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域&#xff0c;MATLAB&#xff08;Matrix Laboratory&#xff09;是一种广泛使用的高级技术计算软件&…

Python爬虫技术详解:从基础到高级应用,实战与应对反爬虫策略【第93篇—Python爬虫】

前言 随着互联网的快速发展&#xff0c;网络上的信息爆炸式增长&#xff0c;而爬虫技术成为了获取和处理大量数据的重要手段之一。在Python中&#xff0c;requests模块是一个强大而灵活的工具&#xff0c;用于发送HTTP请求&#xff0c;获取网页内容。本文将介绍requests模块的…

c++数据结构算法复习基础--1

一、大体复习内容 复习思路&#xff1b; 二、数据结构算法-常见复杂度汇总介绍-性能对比-图表展示 数据结构: 相互之间存在一种或者多种特定关系的数据元素的集合。在逻辑上可以分为线性结构&#xff0c;散列结构、树形结构&#xff0c;图形结构等等。 数据结构说的是组织…

SpringCloud(16)之SpringCloud OpenFeign和Ribbon

一、Spring Cloud OpenFeign介绍 Feign [feɪn] 译文 伪装。Feign是一个轻量级的Http封装工具对象,大大简化了Http请求,它的使用方法 是定义一个接口&#xff0c;然后在上面添加注解。不需要拼接URL、参数等操作。项目主页&#xff1a;GitHub - OpenFeign/feign: Feign makes w…

【竹篮打水】OpenCV4.x 中新增并行代码执行演示

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV支持的并行框架 OpenCV从4.5版本开始&#xff0c;新增了并行代码执行支持&#xff0c;以常见的图像像素遍历卷积计算为…

Vue单文件学习项目综合案例Demo,黑马vue教程

文章目录 前言一、小黑记事本二、购物车三、小黑记账清单 前言 bilibili视频地址 一、小黑记事本 效果图 主代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"/><meta http-equiv"X-UA-Compatible&…

hash,以及数据结构——map容器

1.hash是什么&#xff1f; 定义&#xff1a;hash,一般翻译做散列、杂凑&#xff0c;或音译为哈希&#xff0c;是把任意长度的输入&#xff08;又叫做预映射pre-image&#xff09;通过散列算法变换成固定长度的输出&#xff0c; 该输出就是散列值。这种转换是一种压缩映射&…

Android14之input高级调试技巧(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

JVM面试

什么是JVM 1.JVM是java虚拟机&#xff0c;是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件 2.为了支持java中的一次编译到处运行的跨平台特性&#xff0c;jvm可以在不同的系统上运行 3.jvm能自动为对象&#xff0c;方法等分配内存&#xff0c;以及自动的…

Day01:Web应用架构搭建站库分离路由访问配置受限DNS解析

目录 常规的Web应用搭建 三种常规网站搭建模式 程序源码 中间件配置 数据库类型 文件访问路径 总结 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件…

如何在Win系统搭建Oracle数据库并实现远程访问【内网穿透】

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…