2023NOIP A层联测32 红楼 ~ Eastern Dream

题目大意

给定一个长度为 n n n的序列 a a a,有 m m m次操作,每次操作有两种类型:

  • 1 x y k,对于所有满足 ( i − 1 ) m o d x ≤ y (i-1)\bmod x\leq y (i1)modxy i i i,将 a i a_i ai的值加上 k k k
  • 2 l r,求 ∑ i = l r a i \sum\limits_{i=l}^ra_i i=lrai

数组下标从 1 1 1开始。

1 ≤ n , m ≤ 2 × 1 0 5 , 1 ≤ x , y ≤ n , 1 ≤ a i , k ≤ 1 0 9 1\leq n,m\leq 2\times 10^5,1\leq x,y\leq n,1\leq a_i,k\leq 10^9 1n,m2×105,1x,yn,1ai,k109

时间限制 800 m s 800ms 800ms,空间限制 32 M B 32MB 32MB


题解

前置知识:根号分治

考虑根号分治,将每次修改和查询分为 x ≤ n x\leq \sqrt n xn x > n x>\sqrt n x>n 两种情况来考虑。

x ≤ n x\leq \sqrt n xn 时,设 v i , j v_{i,j} vi,j表示对于所有 ( t − 1 ) m o d i = j (t-1)\bmod i=j (t1)modi=j t t t a t a_t at要加上的值, v s i , j vs_{i,j} vsi,j v i , j v_{i,j} vi,j的前缀和,也就是对于所有 ( t − 1 ) m o d i ≤ j (t-1)\bmod i\leq j (t1)modij t t t a t a_t at要加上的值。那么每次修改是 O ( n ) O(\sqrt n) O(n )的。对于查询,枚举每个 i i i,求在 i i i为模数时区间 [ l , r ] [l,r] [l,r]对答案的贡献,对每个 i i i都可以 O ( 1 ) O(1) O(1)计算贡献,那么时间复杂度为 O ( n ) O(\sqrt n) O(n )

x > n x>\sqrt n x>n 时,要修改的区间数量不超过 n \sqrt n n 个,那么我们可以用线段树来修改和查询,修改的时间复杂度为 O ( n log ⁡ n ) O(\sqrt n\log n) O(n logn),查询的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)

这样的总时间复杂度为 O ( m n log ⁡ n ) O(m\sqrt n\log n) O(mn logn),会 TLE \text{TLE} TLE,下面考虑优化。

x ≤ n x\leq \sqrt n xn 的部分的时间复杂度是可以接受的,我们只需要优化 x > n x>\sqrt n x>n 部分的时间复杂度。

注意到单次修改要修改 O ( n ) O(\sqrt n) O(n )个区间,而单次查询只需要查询 1 1 1个区间,我们考虑差分。

p i p_i pi表示 a i a_i ai经过修改后增加了多少,那么我们可以维护 p p p的差分数组 c c c。对于每次对区间 [ l , r ] [l,r] [l,r]的修改,我们只需要修改 c l c_l cl c r + 1 c_{r+1} cr+1的值,是 O ( 1 ) O(1) O(1)的, O ( n ) O(\sqrt n) O(n )次单点修改的时间复杂度是 O ( n ) O(\sqrt n) O(n )的。

对于每次查询 [ l , r ] [l,r] [l,r],我们需要得到 ∑ i = l r p i = ∑ i = l r ∑ j = 1 i c j \sum\limits_{i=l}^rp_i=\sum\limits_{i=l}^r\sum\limits_{j=1}^ic_j i=lrpi=i=lrj=1icj,下面来推一下这个式子:

∑ i = l r ∑ j = 1 i c j = ∑ i = 1 l − 1 c i × ( r − l + 1 ) + ∑ i = l r c i × ( r − i + 1 ) = ( r − l + 1 ) ∑ i = 1 l − 1 c i + ( r + 1 ) ∑ i = l r c i + ∑ i = l r i × c i \sum\limits_{i=l}^r\sum\limits_{j=1}^ic_j=\sum\limits_{i=1}^{l-1}c_i\times (r-l+1)+\sum\limits_{i=l}^rc_i\times (r-i+1)=(r-l+1)\sum\limits_{i=1}^{l-1}c_i+(r+1)\sum\limits_{i=l}^rc_i+\sum\limits_{i=l}^ri\times c_i i=lrj=1icj=i=1l1ci×(rl+1)+i=lrci×(ri+1)=(rl+1)i=1l1ci+(r+1)i=lrci+i=lri×ci

我们可以用分块来维护 c i c_i ci i × c i i\times c_i i×ci,那么每次查询就相当于分块中的区间查询,一次查询的时间复杂度是 O ( n ) O(\sqrt n) O(n )的。用了分块之后,上面的单点修改操作仍然可以 O ( 1 ) O(1) O(1)解决。

总时间复杂度为 O ( m n ) O(m\sqrt n) O(mn )

虽然时间复杂度理论可行,但时限只有 800 m s 800ms 800ms,而且常数比较大,所以还是要卡一下常。

在下面的代码中,因为 c ≤ n c\leq \sqrt n cn 的部分的常数比 c > n c>\sqrt n c>n 的部分的常数大,所以我们可以将根号分治中分类讨论的决策点调小一点,分为 c ≤ n 2 c\leq \dfrac{\sqrt n}{2} c2n c > n 2 c>\dfrac{\sqrt n}{2} c>2n 来分类讨论,这样能快一些。当然,这个决策点还是要根据你的代码来定。

code

#include<bits/stdc++.h>
#define rg register
using namespace std;
const int N=200000,B=1000;
int n,m,bl,a[N+5];
long long ans=0,s[N+5],v[B+5][B+5],sv[B+5][B+5];
long long p1[N+5],w1[B+5],p2[N+5],w2[B+5];
inline int rd(){int t=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){t=t*10+ch-'0';ch=getchar();}return t;
}
inline int pos(int i){return (i-1)/bl+1;
}
inline void pt(int x,int k){if(x>n) return;p1[x]+=k;w1[pos(x)]+=k;p2[x]+=1ll*x*k;w2[pos(x)]+=1ll*x*k;
}
inline long long gt1(int l,int r){long long re=0;int vl=pos(l),vr=pos(r);if(vl==vr){for(rg int i=l;i<=r;i++) re+=p1[i];return re;}for(rg int i=l;i<=vl*bl;i++) re+=p1[i];for(rg int i=vl+1;i<=vr-1;i++) re+=w1[i];for(rg int i=vr*bl-bl+1;i<=r;i++) re+=p1[i];return re;
}
inline long long gt2(int l,int r){long long re=0;int vl=pos(l),vr=pos(r);if(vl==vr){for(rg int i=l;i<=r;i++) re+=p2[i];return re;}for(rg int i=l;i<=vl*bl;i++) re+=p2[i];for(rg int i=vl+1;i<=vr-1;i++) re+=w2[i];for(rg int i=vr*bl-bl+1;i<=r;i++) re+=p2[i];return re;
}
int main()
{
//	freopen("scarlet.in","r",stdin);
//	freopen("scarlet.out","w",stdout);n=rd();m=rd();bl=sqrt(n);if(n>=100) bl/=2;for(rg int i=1;i<=n;i++){a[i]=rd();s[i]=s[i-1]+a[i];}for(rg int o=1,tp,k;o<=m;o++){tp=rd();if(tp==1){int x=rd(),y=rd(),k=rd();y=min(y,x-1);if(x<=bl){for(rg int i=0;i<=y;i++) v[x][i]+=k;sv[x][0]=v[x][0];for(rg int i=1;i<x;i++) sv[x][i]=sv[x][i-1]+v[x][i];}else{for(rg int l=1;l<=n;l+=x){pt(l,k);pt(l+y+1,-k);}}}else{int l=rd(),r=rd();ans=s[r]-s[l-1];for(rg int i=1;i<=bl;i++){int vl=(l-1)/i,vr=(r-1)/i,ml=(l-1)%i,mr=(r-1)%i;ans+=sv[i][mr];if(ml>=1) ans-=sv[i][ml-1];ans+=(vr-vl)*sv[i][i-1];}ans+=(r-l+1)*gt1(1,l-1)+(r+1)*gt1(l,r)-gt2(l,r);printf("%lld\n",ans);}}return 0;
}

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

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

相关文章

servlet 的XML Schema从哪边获取

servlet 6.0的规范定义&#xff1a; https://jakarta.ee/specifications/servlet/6.0/ 其中包含的三个XML Schema&#xff1a;web-app_6_0.xsd、web-common_6_0.xsd、web-fragment_6_0.xsd。但这个页面没有给出下载的链接地址。 正好我本机有Tomcat 10.1.15版本的源码&#…

vue3 中的ref、reactive的介绍

reactive&#xff1a; 当使用reactive()处理数据后&#xff0c;数据再次被使用时&#xff0c;就会进行依赖收集 当数据发生改变时&#xff0c;所有收集到的依赖进行对应的响应式操作&#xff08;如&#xff1a;更新界面&#xff09;&#xff0c; 事实上&#xff0c;我们编写的d…

深入解析JavaScript中的变量作用域与声明提升

JS中的变量作用域 背景&#xff1a; ​ 之前做js逆向的时候&#xff0c;有一个网站很有意思&#xff0c;就是先出现对其赋值&#xff0c;但是后来的变量赋值没有对其发生修改&#xff0c;决定说一下js中的作用域问题. 全局作用域&#xff1a; ​ 全局作用域的变量可以在任何…

PDF自动打印

​ 最近接到用户提过来的需求&#xff0c;需要一个能够自动打印图纸的功能&#xff0c;经过几天的研究整出来个初版了的&#xff0c;分享出来给大家&#xff0c;希望能有帮助。 需求描述: ​ 生产车间现场每天都有大量的图纸需要打印&#xff0c;一个一个打印太慢了&#xff0…

什么是3D建模中的“高模”和“低模”?

3D建模中什么是高多边形和低多边形&#xff1f; 高多边形建模和低多边形建模之间的主要区别正如其名称所暗示的那样&#xff1a;您是否在模型中使用大量多边形或少量多边形。 然而&#xff0c;在决定每个模型的细节和多边形级别时&#xff0c;还需要考虑其他事项。最值得注意的…

一文解码语言模型:语言模型的原理、实战与评估

在本文中&#xff0c;我们深入探讨了语言模型的内部工作机制&#xff0c;从基础模型到大规模的变种&#xff0c;并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究&#xff0c;提供了一份全面而深入的视角&#xff0c;旨在帮助读者更准确地理解和评估语言模…

NI USRP软件无线设备的特点

NI USRP软件无线设备 NI的USRP(Universal Software Radio Peripheral)设备是RF应用中使用的软件无线(SDR)。NI的USRP收发器可以在多个频段发送和接收RF信号&#xff0c;因此可用于通信工程教育和研究。通过与LabVIEW开发环境相结合&#xff0c;USRP可以实现使用无线信号验证无…

接口开放太麻烦?试试阿里云API网关吧

前言 我在多方合作时&#xff0c;系统间的交互是怎么做的&#xff1f;这篇文章中写过一些多方合作时接口的调用规则和例子&#xff0c;然而&#xff0c;接口开放所涉及的安全、权限、监控、流量控制等问题&#xff0c;可不是简简单单就可以解决的&#xff0c;这一般需要专业的…

使用pixy计算群体遗传学统计量

1 数据过滤 过滤参数&#xff1a;过滤掉次等位基因频率&#xff08;minor allele frequency&#xff0c;MAF&#xff09;低于0.05、哈达-温伯格平衡&#xff08;Hardy– Weinberg equilibrium&#xff0c;HWE&#xff09;对应的P值低于1e-10或杂合率&#xff08;heterozygosit…

【科研新手指南3】chatgpt辅助论文优化表达

chatgpt辅助论文优化表达 写在最前面最终版什么是好的论文整体上&#xff1a;逻辑/连贯性细节上一些具体的修改例子 一些建议&#xff0c;包括具体的提问范例1. 明确你的需求2. 提供上下文信息3. 明确问题类型4. 测试不同建议5. 请求详细解释综合提问范例&#xff1a; 常规技巧…

Spring6(一):入门案例

文章目录 1. 概述1.1 Spring简介1.2 Spring 的狭义和广义1.3 Spring Framework特点1.4 Spring模块组成 2 入门2.1 构建模块2.2 程序开发2.2.1 引入依赖2.2.2 创建java类2.2.3 创建配置文件2.2.4 创建测试类测试 2.3 程序分析2.4 启用Log4j2日志框架2.4.1 引入Log4j2依赖2.4.2 加…

Unity C# 打开windows对话框选择文件夹或选择文件

unity没有提供打开windows对话框的api&#xff0c;在开发种也会遇到选择系统文件夹或选择系统文件的需求 /// /工具&#xff1a;windows系统文件夹/文件选择窗口// /// using System; using System.Runtime.InteropServices; public class OpenFile {/// <summary>/// 选…

SPringBoot项目调用本地python算法

在Spring Boot项目中调用本地Python算法的方法通常是通过使用Spring的Java-Python交互功能&#xff0c;以及通过Spring的依赖注入将Python函数注入到Java对象中。下面是一种可能的方法&#xff1a; 首先&#xff0c;你需要在你的Spring Boot项目中配置Python解释器。你可以使用…

轻量封装WebGPU渲染系统示例<32>- 若干线框对象(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/WireframeEntityTest.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class WireframeEntityTest {private mRsc…

人工智能基础_机器学习030_ElasticNet弹性网络_弹性回归的使用---人工智能工作笔记0070

然后我们再来看elastic-net弹性网络,之所以叫弹性是因为,他融合了L1和L2正则,可以看到 他的公式 公式中有L1正则和L2正则两个都在这个公式中 可以看到弹性网络,在很多特征互相联系的时候,非常有用,比如, 相关性,如果数学好,那么物理也好,如果语文好,那么英语也好 这种联系 正…

JZ22:链表中倒数第k个结点

JZ22&#xff1a;链表中倒数第k个结点 题目描述&#xff1a; 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 示例1 输入&#xff1a; 1,{1,2,3,4,5} 返回值&#xff1a; {5} 分析&#xff1a; 快慢指针思想&#xff1a; 需要两个指针&#xff0c;快指针fast&…

python 基础语法 (常常容易漏掉)

同一行显示多条语句 python语法中要求缩进&#xff0c;但是同一行可以显示多条语句 在 Python 中&#xff0c;可以使用分号 (;) 将多个语句放在同一行上。这样可以在一行代码中执行多个语句&#xff0c;但需要注意代码的可读性和维护性。 x 5; y 10; z x y; print(z) 在…

使用c++程序,实现图像平移变换,图像缩放、图像裁剪、图像对角线镜像以及图像的旋转

数字图像处理–实验三A图像的基本变换 实验内容 A实验&#xff1a; &#xff08;1&#xff09;使用VC设计程序&#xff1a;实现图像平移变换&#xff0c;图像缩放、图像裁剪、图像对角线镜像。 &#xff08;2&#xff09;使用VC设计程序&#xff1a;对一幅高度与宽度均相等的…

PaddleClas学习1——使用PPLCNet模型对车辆属性进行识别(python)

使用PPLCNet模型对车辆属性进行识别 1. 配置PaddlePaddle,PaddleClas环境1.1 安装PaddlePaddle(1)创建 docker 容器(2)退出/进入 docker 容器(3) 安装验证1.2 安装python3.8(可选)1.3 安装 PaddleClas2. 模型推理2.1 下载官方提供的车辆属性模型2.2 基于 Python 预测引…