[Ynoi2011] 初始化

news/2024/9/18 8:54:19/文章来源:https://www.cnblogs.com/hzoi-Cu/p/18378087

题目链接 : [Ynoi2011] 初始化

神仙trick + 卡常题,前缀后缀和根本没听过。

根号分治 + 分块。

对于修改操作,发现是跳着修改,考虑根号分治。

  1. \(x \ge \sqrt{n}\),直接暴力更改,复杂度\(O(\sqrt{n})\)
  2. 反之,可以将序列抽象成一堆大小为\(x\)的段,如图,\(l,r\)是查询的区间。

image

发现\(l\sim r\)中间的整块一定都会被修改到,但是散块会被部分修改。由于题面中有一个重要的性质\(y\le x\),所以\(y\)一定在第一块中。

记两个数组\(pre_{i,j}\)表示记录当以\(i\)为块长分割序列时,前\(j\)个位置被更改的前缀和,\(suf_{i,j}\)为后缀和。

对于一个查询\(l,r\),如果是整块,直接前缀和求差,如果不在同一块,那么直接求\(l\)到其所在块末的后缀和,\(r\)到其所在块的前缀和,还有中间整块的贡献。

由于常数原因,\(x\)的阈值不应设太大,实测大约120左右跑的最快,序列分块时的块长取\(\sqrt{n}\)即可。

本题并不卡常,cin/cout关了同步流就可过。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;const int N = 2e5 + 10,M = 500,mod = 1e9 + 7;
inline void Mod(int &x){if(x > mod) x -= mod;}
int n,m,a[N],len,pos[N],L[M],R[M],sum[M],limit,pre[M][M],suf[M][M],siz;
inline void solve(){cin>>n>>m;for(int i = 1;i <= n; ++i) cin>>a[i];limit = 128;len = sqrt(n),siz = n/len;for(int i = 1;i <= siz; ++i) L[i] = R[i - 1] + 1,R[i] = L[i] + len - 1;if(R[siz] < n) siz++,L[siz] = R[siz - 1] + 1,R[siz] = n;for(int i = 1;i <= siz; ++i){for(int j = L[i];j <= R[i]; ++j){pos[j] = i;Mod((sum[i] += a[j]));}}auto update1 = [&](int x,int y,int z)-> void{for(int i = y;i <= n;i += x){Mod(a[i] += z);Mod(sum[pos[i]] += z);}};auto update2 = [&](int x,int y,int z) -> void{for(int i = x;i >= y; --i) Mod(pre[x][i] += z);for(int i = 1;i <= y; ++i) Mod(suf[x][i] += z);};auto Q = [&](int left,int right) -> int{int p = pos[left],q = pos[right],res = 0;if(p == q){for(int i = left;i <= right; ++i) Mod(res += a[i]);return res;}for(int i = left;i <= R[p]; ++i) Mod(res += a[i]);for(int i = L[q];i <= right; ++i) Mod(res += a[i]);for(int i = p + 1;i < q; ++i) Mod(res += sum[i]);return res;};auto query = [&](int left,int right) -> int{int res = Q(left,right);for(int i = 1;i < limit; ++i){const int p = (left - 1)/i+1,q = (right-1)/i+1;if(p == q){Mod(res += pre[i][(right-1)%i+1]);Mod((res -= pre[i][(left-1)%i]) += mod);}else{res = (res + (q - p - 1ll)*pre[i][i]%mod)%mod;Mod(res += pre[i][(right-1)%i+1]);Mod(res += suf[i][(left-1)%i+1]);}}return res;};for(int i = 1,op,l,r,x,y,z;i <= m; ++i){cin>>op;if(op^2){cin>>x>>y>>z;Mod(z);if(x >= limit) update1(x,y,z);else update2(x,y,z);}else{cin>>l>>r;cout<<query(l,r)<<'\n';}}
}
signed main(){cin.tie(nullptr)->sync_with_stdio(false);cout.tie(nullptr)->sync_with_stdio(false);solve();
}

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

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

相关文章

windows Tauri 构建(Release)时下载 WiX等其它打包文件失败

方法 手动下载放到指定的目录 参考这幅图:注意:随着版本的更新上面的方法存在一个小问题,需要把文件夹名字改一下,WixTools改成WixTools314参考 https://github.com/tauri-apps/tauri/issues/7338

【微信小程序开发】栀子手作花花微信小程序商城开发最佳实践

本文介绍了通过uniapp技术实现了一套栀子手作在线购物商城系统。包含首页、分类、我的等常用功能入口。本文介绍了通过uniapp技术实现了一套栀子手作在线购物商城系统。包含首页、分类、我的等常用功能入口。一、功能演示 首页:包含了商品介绍,领劵中心和商品列表区域。 商品…

《Programming from the Ground Up》阅读笔记:p103-p116

《Programming from the Ground Up》学习第7天,p103-p116总结,总计14页。 一、技术总结 1.读写文件 (1)linux.s linux.s: #file name:linux.s# system call numbers(按数字大小排列,方便查看) .equ SYS_READ, 0 .equ SYS_WRITE, 1 .equ SYS_OPEN, 2 .equ SYS_CLOSE, 3 .equ …

控件与布局

1.控件的分类:主要要6大类一.布局控件:可以容纳多个控件或者嵌套其他布局控件,用于在UI上组织和排列控件。Grid、StackPanel、DockPanel等都属于此类,他们拥有共同的父类Panel二.内容控件:只能容纳一个其他控件或者布局控件作为他的内容。Window、Button等都属于此类,因为…

第7篇:在虚拟机 centos7上搭建jira管理工具

本文详细介绍了如何在CentOS7系统上下载配置Jira,包括创建文件夹、下载安装包、解压、修改配置文件以及设置JVM和MySQL环境。同时,文章还涉及了JDK1.8的安装,数据库的创建,以及Jira的破解步骤,包括替换特定jar文件和配置数据库连接。最后,文章提到了启动Jira服务并进行汉…

最近遇到的一些奇奇怪怪奇技淫巧

然后我CF上绿了————DaisySunchaser要多思考。构造——从哪里入手?CF交互指南要多注意。 我的最初想法:当我查看了他使用了冰茶几的代码: #include<bits/stdc++.h> #define ll long long #define N 200005 #define mp make_pair using namespace std; int T,n,u[N]…

Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和桌面推流

一、前言 随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求。之前就已经打通了音视频文件和视频流的采集,那是不是可以简单点的方式就能…

如何缩短微信文章链接长度

有时候,我们想把微信公众号的文章发到其他平台上,这时候就需要复制文章的链接。有时候,我们想把微信公众号的文章发到其他平台上,这时候就需要复制文章的链接。 ‍ 手机端复制方式如下: ​ ‍ 微信对于短网址的优化 以前,微信公众号文章的链接特别长。但在 2016 年末,微…

verilog代码与设计总结

Verilog编码风格及设计建议相比于case语句,casez语句将z态看做不关心,casex语句将z态和x态看做不关心。并且所有case类型语句均没有优先级。 锁存器是组合逻辑产生的,一般没有复位端,所以根据其所存特性,在上电的时候没法确定其初始状态,因此正常情况下要避免使用。 组合…

【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?

问题描述 使用标准版的Azure Logic App服务,可以创建多个工作流(workflow),如果在启用/禁用其它的工作流时,是否会对正在运行其它工作流造成影响呢? 问题解答 在实际的测验中,我们得到的答案是:会造成影响!在Disabled/Enabled同一个Logic App中的Workflow时,正在运行的…

开源|一款企业应用定制化开发平台,支持企业OA协同办公类信息化系统的建设和开发

前言 在数字化转型的浪潮中,企业面临着多样化的信息系统建设需求。现有的软件系统往往存在定制化程度低、开发周期长、成-本高等问题。此外,随着企业规模的扩大和业务的复杂化,传统的软件系统难以满足灵活多变的业务需 为了解-决这些痛点,企业需要一款能够快速定制、灵活扩…