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的更多相关文章

  1. sql server CDC报错:超出存储过程、函数、触发器的最大嵌套层数(最大层为32)

     sys.sp_MScdc_capture_job   RAISERROR(22801, 10, -1)      --原本 go sys.sp_MScdc_capture_job; go --修改后 ...

  2. 使用T4模板生成代码的学习

    之前做项目使用的都是Db First,直接在项目中添加Entity Framework,使用T4模板(T4模板引擎之基础入门)生成DAL BLL层等(T4模板是一个同事给的,也没有仔细研究,代码如下: ...

  3. 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。

    原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...

  4. 经典网络LeNet5看卷积神经网络各层的维度变化

    本文介绍以下几个CNN经典模型:Lenet(1986年).Alexnet(2012年).GoogleNet(2014年).VGG(2014年).Deep Residual Learning(2015年 ...

  5. Python数据分析之Pandas操作大全

    从头到尾都是手码的,文中的所有示例也都是在Pycharm中运行过的,自己整理笔记的最大好处在于可以按照自己的思路来构建矿建,等到将来在需要的时候能够以最快的速度看懂并应用=_= 注:为方便表述,本章设 ...

  6. Fully Convolutional Networks for semantic Segmentation(深度学习经典论文翻译)

    摘要 卷积网络在特征分层领域是非常强大的视觉模型.我们证明了经过端到端.像素到像素训练的卷积网络超过语义分割中最先进的技术.我们的核心观点是建立"全卷积"网络,输入任意尺寸,经过有 ...

  7. CNN & RNN 及一些常识知识(不断扩充中)

    参考: http://blog.csdn.net/iamrichardwhite/article/details/51089199 一.神经网络的发展历史 五六十年代,提出感知机 八十年代,提出多层感 ...

  8. Deep Learning(深度学习)学习笔记整理

    申明:本文非笔者原创,原文转载自:http://www.sigvc.org/bbs/thread-2187-1-3.html 4.2.初级(浅层)特征表示 既然像素级的特征表示方法没有作用,那怎样的表 ...

  9. 基于jquery的表格动态创建,自动绑定,自动获取值

    最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...

  10. 【转载】Deep Learning(深度学习)学习笔记整理

    http://blog.csdn.net/zouxy09/article/details/8775360 一.概述 Artificial Intelligence,也就是人工智能,就像长生不老和星际漫 ...

随机推荐

  1. 甲方扔给两个存在包名与类名均相同的Jar包,要在工程中同时使用怎么办?

    你的项目是否曾遇到过有jar包冲突,而这些冲突的jar包又必须同时存在的情况?一般来说,jar 冲突都是因不同的上层依赖项,自身又依赖了相同 jar 包的不同版本所致,解决办法也都是去除其中一个即可. ...

  2. CSS学习(四)值和单位

    一.关键字.字符串和其它文本值 关键字:与其它编程语言一样,是代表特定含义的一个单词( 接收关键字的属性,所取的关键字必须在那个属性允许使用的关键字范围之内 ) 字符串:前后引号要保持一致( 可以是单 ...

  3. APT 使用

    使用 Ubuntu 包搜索器 apt 命令 功能 apt install 安装软件包 apt remove 移除软件包 apt purge 移除软件包及配置文件 apt update 刷新存储库索引 ...

  4. Linux 扩展磁盘分区

    之前安装 Ubuntu 虚拟机时使用的都是默认配置,虚拟机硬盘分配了 60 GB.后来想要扩容,特此记录一下扩容过程. 在操作前请做好备份 首先在 VMware 中修改虚拟硬盘大小. 然后进入虚拟机, ...

  5. MyBatis分页实现

    目录 分页实现 limit实现分页 RowBounds分页 分页实现 limit实现分页 为什么需要分页? 在学习mybatis等持久层框架的时候,会经常对数据进行增删改查操作,使用最多的是对数据库进 ...

  6. MVCC能否解决幻读?

    一.什么是MVCC 多版本控制: 指的是一种提高并发的技术.最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞.引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提 ...

  7. 闲的蛋疼整理了一下Dockerfile的命令和参数备查

    Dockerfile 主要指令及参数: 指令 主要参数 作用 用法示例 FROM <image>[:<tag>] [AS <name>] 指定基础镜像 FROM u ...

  8. ASP.NET Core – ADO.NET

    前言 自从用 Entity Framework 就再也没有用过 ADO.NET 了. 很多年前写过 基础 ADO.NET 访问MYSQL 与 MSSQL 数据库例子. 今天刚好想做个单侧, 那就顺便翻 ...

  9. CSS – display, visibility, opacity, transparent 的区别

    前言 要让一个元素"消失", 有 3 种做法. 它们有一点点的不同. 在实战时要清楚什么时候用什么哦. 例子说明 <div class="abc"> ...

  10. Asp.net core 学习笔记之 globalization & localization 复习篇

    更新: 2022-03-22 修订版: ASP.NET Core – Globalization & Localization 更新: 2021-06-15 之前有说过, 我没有使用默认的 f ...