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. Axure 0基础实战入门 模拟一个app页面

    Axure 0基础实战入门 模拟一个app页面 第一次接触axure9,尝试模拟一个app页面与交互 页面原型 我选择了一个免费的日程app,下载rp文件后导入到axure 模拟实现登录页面 新建两个 ...

  2. Linux 主流桌面环境

    GNOME KDE Xfce Ubuntu 使用 GNOME 作为桌面环境. 基于 KDE Plasma 开发的 Ubuntu 发行版:Kubuntu 基于 Xfce 开发的 Ubuntu 发行版:X ...

  3. 【Linux】之切换root用户与重启系统相关命令

    一.切换用户 <Linux中怎么从root用户切换到普通用户> su是在用户间切换,可以是从普通用户切换到root用户, test@ubuntu:~$ su Password: root@ ...

  4. HashMap深入讲解

    HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构, 而HashSet和HashMap者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说HashSet ...

  5. C++性能优化——能用array就不要用unordered_map作为查询表

    unordered_map需要哈希值计算和表查询的开销,当key值为整数且连续,直接用数组作为查询表具有更高的效率. #include <iostream> #include <ch ...

  6. Encoder-Decoder、Seq2Seq、Attention

    Encoder-Decoder.Seq2Seq.Attention 传送门1:Encoder-Decoder 和 Seq2Seq 因为注意力不集中,所以这篇随笔就是看别人的文章,随手参考写写的. 1. ...

  7. BOM – Cookie 和 LocalStorage

    前言 Cookie 和 LocalStorage 是非常基础的东西. 我是学编程后, 第 3 年才开始写博客的, 所以很多在第 1, 2 年学的知识完全都没有记入下来. (比如 C#, JS 语法等等 ...

  8. nRF24L01芯片驱动记录

    nRF24L01芯片驱动记录 ​ 学习完了usb,了解了部分元器件的功能以及用途后,打算在端午假期用一天的时间完成一个小目标,不过实际上是花了一天半才成功实现,现将驱动nRF24L01芯片的整个过程记 ...

  9. 全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用

    全网最适合入门的面向对象编程教程:56 Python 字符串与序列化-正则表达式和 re 模块应用 摘要: Python 的 re 模块提供了强大的正则表达式操作功能,用于在字符串中搜索.匹配.替换等 ...

  10. 解决 -Code 安装似乎损坏。请重新安装

    问题: 1. 安装插件  fix VSCode Checksums 2. ctrl+shift+P打开命令面板 3. 输入 Fix Checksums: Apply 4.  重新启动VSCode