2023NOIP A层联测32 T4 红楼 ~ Eastern Dream
2023NOIP A层联测32 T4 红楼 ~ Eastern Dream
根号分治加分块。
Ps:分块后面真的用的多。
思路
考虑根号分治,将 \(x\) 分为 \(x \leq \sqrt n\) 的情况和 \(x>\sqrt n\) 的情况。
\(x \leq \sqrt n\)
由于这一部分较小,如果在线段上暴力添加肯定会超时。
先设 \(f_{x,i}\) 表示模 \(x\) 等于 \(i\) 的数加的值,这个值可以每次暴力维护,时间 \(O(\sqrt n)\)。
再维护一个 \(f_x\) 的前缀和,也是 \(O(\sqrt n)\)。
每次查询时,枚举 \(x\),求 \([l,r]\) 中有几个 \(x\) 余数的整段。
对于整段,可以直接乘求贡献;对于区间前后的零散段,可以通过前缀和求贡献。
这一部分的维护和查询均 \(O(\sqrt n)\)。
\(x>\sqrt n\)
对于修改操作,直接去暴力跳原数列上的 \(\frac{n}{x}\) 段去区间修改,对于一段使用线段树可以达到 \(\log n\) 的效果,但是有最多 \(\sqrt n\) 段,所以说没一段必须要 \(O(1)\) 修改,而查询可以支持 \(O(\sqrt n)\)。
不难想到可以分块,对于整数段可以直接加上一个值,对于零散块可以差分。由于每一段最多访问 \(2\) 次,所以复杂度可以保证在 \(O(\sqrt n)\)。
总结一下,对于 \(x \leq \sqrt n\) 的情况,更改维护 \(f_x\) 的前缀和,查询直接暴力加查询区间的值。
对于 \(x>\sqrt n\) 的情况,使用分块维护更改,查询也直接加查询区间内的块就 OK。
时间复杂度 \(O(m\sqrt n)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+5,maxm=1000;
int n,m,block,a[maxn],L[maxn],R[maxn];
ll sum[maxm],c[maxn],pub[maxn],f[maxm][maxm],fs[maxm][maxm];
namespace IO{
#define BF_SIZE 100000
bool IOerr=0;
inline char nc(){
static char buf[BF_SIZE],*p1=buf+BF_SIZE,*pend=buf+BF_SIZE;
if(p1==pend){
p1=buf;
pend=buf+fread(buf,1,BF_SIZE,stdin);
if(pend==p1){IOerr=1;return -1;}
}
return *p1++;
}
inline bool bla(char ch){return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';}
inline void Rd(int &x){
char ch;
while(bla(ch=nc()));
if(IOerr){return;}
for(x=ch-'0';(ch=nc())>='0'&&ch<='9';x=x*10+ch-'0');
}
inline void Rd(ll&x){
char ch;
while(bla(ch=nc()));
if(IOerr){return;}
for(x=ch-'0';(ch=nc())>='0'&&ch<='9';x=x*10+ch-'0');
}
#undef BF_SIZE
};
inline void write(ll X)
{
if(X<0) {X=~(X-1); putchar('-');}
if(X>9) write(X/10);
putchar(X%10+'0');
}
inline void ycl()
{
for(int i=1;i<=n;i++)
{
int id=(i-1)/block;
sum[id]+=a[i];
}
}
int main()
{
IO::Rd(n), IO::Rd(m);
block=max((int)sqrt(n/4),1);
for(int i=1;i<=n;i++) IO::Rd(a[i]);
for(int i=0;i<=(n-1)/block;i++) L[i]=block*i+1,R[i]=block*i+block;
ycl();
for(int o=1;o<=m;o++)
{
int op,x,y;
ll k;
IO::Rd(op);IO::Rd(x);IO::Rd(y);
if(op==2)
{
int l=x,r=y;
ll ans=0;
for(int i=1;i<=block;i++)
{
int tl=(l-1)%i,tr=(r-1)%i;
int ml=(l-1)/i,mr=(r-1)/i;
if(ml==mr) ans+=fs[i][tr+1]-fs[i][tl];
else
{
ans+=(mr-ml-1)*fs[i][i];
ans+=fs[i][i]-fs[i][tl];
ans+=fs[i][tr+1];
}
}
int idl=(l-1)/block,idr=(r-1)/block;
if(idl==idr)
{
ll cj=0;
for(int i=L[idl];i<l;i++) cj+=c[i];
for(int i=l;i<=r;i++)
{
cj+=c[i];
ans+=cj+pub[idl]+a[i];
}
}
else
{
ll cj=0;
for(int i=L[idl];i<l;i++) cj+=c[i];
for(int i=l;i<=R[idl];i++)
{
cj+=c[i];
ans+=cj+pub[idl]+a[i];
}
for(int i=idl+1;i<idr;i++) ans+=sum[i];
cj=0;
for(int i=L[idr];i<=r;i++)
{
cj+=c[i];
ans+=cj+pub[idr]+a[i];
}
}
write(ans);
putchar('\n');
continue;
}
IO::Rd(k);
y=min(y,x-1);
if(x<=block)
{
for(int i=1;i<=y+1;i++) f[x][i]+=k;
for(int i=1;i<=x;i++) fs[x][i]=fs[x][i-1]+f[x][i];
}
else
{
for(int i=1;i<=n;i+=x)
{
int l=i,r=i+y;
r=min(r,n);
int idl=(l-1)/block,idr=(r-1)/block;
if(idl==idr)
{
c[l]+=k;
if(r<min((int)R[idl],n)) c[r+1]-=k;
sum[idl]+=(r-l+1)*k;
}
else
{
c[l]+=k;
sum[idl]+=(R[idl]-l+1)*k;
for(int i=idl+1;i<idr;i++)
{
pub[i]+=k;
sum[i]+=k*block;
}
c[L[idr]]+=k;
sum[idr]+=(r-(L[idr])+1)*k;
if(r<min((int)R[idr],n)) c[r+1]-=k;
}
}
}
}
}
2023NOIP A层联测32 T4 红楼 ~ Eastern Dream的更多相关文章
- sql server CDC报错:超出存储过程、函数、触发器的最大嵌套层数(最大层为32)
sys.sp_MScdc_capture_job RAISERROR(22801, 10, -1) --原本 go sys.sp_MScdc_capture_job; go --修改后 ...
- 使用T4模板生成代码的学习
之前做项目使用的都是Db First,直接在项目中添加Entity Framework,使用T4模板(T4模板引擎之基础入门)生成DAL BLL层等(T4模板是一个同事给的,也没有仔细研究,代码如下: ...
- 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。
原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...
- 经典网络LeNet5看卷积神经网络各层的维度变化
本文介绍以下几个CNN经典模型:Lenet(1986年).Alexnet(2012年).GoogleNet(2014年).VGG(2014年).Deep Residual Learning(2015年 ...
- Python数据分析之Pandas操作大全
从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...
- Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)
摘要 卷积网络在特征分层领域是非常强大的视觉模型.我们证明了经过端到端.像素到像素训练的卷积网络超过语义分割中最先进的技术.我们的核心观点是建立"全卷积"网络,输入任意尺寸,经过有 ...
- CNN & RNN 及一些常识知识(不断扩充中)
参考: http://blog.csdn.net/iamrichardwhite/article/details/51089199 一.神经网络的发展历史 五六十年代,提出感知机 八十年代,提出多层感 ...
- Deep Learning(深度学习)学习笔记整理
申明:本文非笔者原创,原文转载自:http://www.sigvc.org/bbs/thread-2187-1-3.html 4.2.初级(浅层)特征表示 既然像素级的特征表示方法没有作用,那怎样的表 ...
- 基于jquery的表格动态创建,自动绑定,自动获取值
最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...
- 【转载】Deep Learning(深度学习)学习笔记整理
http://blog.csdn.net/zouxy09/article/details/8775360 一.概述 Artificial Intelligence,也就是人工智能,就像长生不老和星际漫 ...
随机推荐
- docker安装cdh6.3.2集群(联网版)
一.前言 本次采用的在线安装方式,cdh为6.3.2版本,系统为centos7.4, docker节点可以为任意多个,下文将以3个docker容器为示例进行展示.此方法也可用在docker swarm ...
- XeLaTeX 无法编译含有经过 pdfcrop 裁剪的 PDF 文件的文档
今天在写 LaTeX 文档时踩了个大坑,我在文档里插入了一个 PDF 图片之后文档无法编译了. 于是我去掉多余代码,做了一个最小工作示例: \documentclass{article} \usepa ...
- [kubernetes]使用kubeadm和containerd部署kubernetes
前言 因宿主机内核版本限制和垂直伸缩特性的需要,安装的k8s版本为1.25,runtime为containerd,cni为calico. containerd.kubeadm.kubelet也可以用包 ...
- idea 的Tomcat 的简单配置
不限速网盘下载: https://kohler.lanzouv.com/iSSfc0akw3vc 官网下载: https://tomcat.apache.org/download-80.cgi 正常解 ...
- 国内加速拉取docker镜像的几种方法
参考首页 快捷命令,使用本站代理拉取镜像,并修改回原始镜像名,在删除代理镜像名. 参考以下 docker cli 和 docker-compose.yml 修改镜像名后,继续一直使用本站代理服务未启动 ...
- THREE.JS中 CubeTextureLoader 使用避坑
最近在跟着教程学THREE.JS,毕竟在现在的前端开发市场上,THREE.JS太火爆了. 今天学到"纹理"这一块的时候,跟着教程敲代码,发现自己的没有正确显示,百思不得其解,打开控 ...
- Pytorch数据加载与使用
前言 在训练的时候通常使用Dataset来处理数据集. Dataset的作用 提供一个方式获取数据内容和标签(label). 实战 from torch.utils.data import Datas ...
- Angular 18+ 高级教程 – Angular 的局限和 Github Issues
前言 Angular 绝对有很多缺陷,Issue 非常多,workaround 非常多. 我以前至少有 subscribe 超过 20 个 Issues,几年都没有 right way 处理的. An ...
- TypeScript 高级教程 – 把 TypeScript 当强类型语言使用 (第一篇)
前言 原本是想照着 TypeScript 官网 handbook 写个教程的. 但提不起那个劲... 所以呢, 还是用我自己的方式写个复习和进阶笔记就好了呗. 以前写过的 TypeScript 笔记: ...
- Google sheet
最近做比较多 data migration 的东西. 当我们开发一个新的系统去替代一个旧系统时,通常就需要做大量的 migration 动作. 有好几个做法 我之前比较常用的的工具是 sql 和 c# ...