点此看题面

大致题意: 两种操作,区间求和,将形如\(ax+y\)的位置的元素值加\(z\)。

分块

这种题目显然就是按照\(x\)与\(\sqrt n\)的大小关系来分块。

对于\(x>\sqrt n\),我们用分块来实现单点修改,区间求和

对于\(x\le\sqrt n\),我们考虑枚举\(x\),则可发现每次询问都由若干长度为\(x\)的完整的段和最后一小段不完整的段组成。

那么我们可以对于\(x\),维护一个前缀和数组,然后每次就相当于求出整段和的若干倍加上其中一部分的值(这可以用前缀和差分求出)。

这有点难描述,而且我语文不好,因此直接看代码吧(代码有注释)。

\(P.S.\)据\(hl666\)大佬说,似乎这里不用\(\sqrt n\)作为临界值而用常量\(40\)更优?

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 200000
#define SN 30
#define X 1000000007
#define min(x,y) ((x)<(y)?(x):(y))
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define XSum(x,y) ((x)+(y)>=X?(x)+(y)-X:(x)+(y))
#define XSub(x,y) ((x)<(y)?(x)-(y)+X:(x)-(y))
using namespace std;
int n,a[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define pc(c) (C^FS?FO[C++]=c:(fwrite(FO,1,C,stdout),FO[(C=0)++]=c))
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int T,C;char c,*A,*B,FI[FS],FO[FS],S[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
Tp I void writeln(Con Ty& x) {write(x),pc('\n');}
I void clear() {fwrite(FO,1,C,stdout),C=0;}
}F;
class LargeBlock//对于大的情况
{
private:
#define SZ 450
#define P(x) (((x)-1)/Bs+1)
int Bs,p[N+5],a[N+5],s[SZ+5];
public:
I void Init(CI x,int* v) {Bs=sqrt(x);for(RI i=1;i<=n;++i) Inc(s[p[i]=P(i)],a[i]=v[i]);}//初始化
I void U(CI x,CI y,CI v) {for(RI i=y;i<=n;i+=x) Inc(a[i],v),Inc(s[p[i]],v);}//修改,相当于若干单点修改
I int Q(CI l,CI r)//区间求和
{
RI i,t=0;if(p[l]==p[r]) {for(i=l;i<=r;++i) Inc(t,a[i]);return t;}
for(i=p[l]*Bs;i>=l;--i) Inc(t,a[i]);for(i=(p[r]-1)*Bs+1;i<=r;++i) Inc(t,a[i]);
for(i=p[l]+1;i^p[r];++i) Inc(t,s[i]);return t;
}
}B;
class SmallBlock//对于小的情况
{
private:
int n,a[SN+5];
public:
I void Init(CI x) {n=x;}
I void U(CI y,CI v) {for(RI i=y%n;i^n;++i) Inc(a[i],v);}//暴力维护前缀和
I int Q(CI x,CI y)
{
RI t=1LL*(y-x+1)/n*a[n-1]%X,tx=x%n,ty=y%n;//先求出若干完整块的值
if(x+(y-x+1)/n*n>y) return t;//若不存在不完整块直接返回
tx<=ty?Inc(t,XSub(a[ty],tx?a[tx-1]:0))://如果连成一段
Inc(t,XSum(XSub(a[n-1],tx?a[tx-1]:0),a[ty]));//如果一半在尾,一半在头
return t;
}
}S[SN+5];
int main()
{
RI Qt,i,op,x,y,z,ans;for(F.read(n,Qt),i=1;i<=n;++i) F.read(a[i]);//读入
for(B.Init(n,a),i=1;i<=SN;++i) S[i].Init(i);W(Qt--)
{
if(F.read(op,x,y),op^2) {F.read(z),x<=SN?S[x].U(y,z):B.U(x,y,z);continue;}//处理修改
for(ans=B.Q(x,y),i=1;i<=SN;++i) Inc(ans,S[i].Q(x,y));F.writeln(ans);//处理询问
}return F.clear(),0;
}

【洛谷5309】[Ynoi2012] D1T1(分块)的更多相关文章

  1. 洛谷P4198 楼房重建 (分块)

    洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...

  2. 洛谷P4135 作诗 (分块)

    洛谷P4135 作诗 题目描述 神犇SJY虐完HEOI之后给傻×LYD出了一题: SHY是T国的公主,平时的一大爱好是作诗. 由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章 ...

  3. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  4. 洛谷 P5527 - [Ynoi2012] NOIP2016 人生巅峰(抽屉原理+bitset 优化背包)

    洛谷题面传送门 一道挺有意思的题,想到了某一步就很简单,想不到就很毒瘤( 首先看到这样的设问我们显然可以想到背包,具体来说题目等价于对于每个满足 \(i\in[l,r]\) 的 \(a_i\) 赋上一 ...

  5. 洛谷P3247 [HNOI2016]最小公倍数(分块 带撤销加权并查集)

    题意 题目链接 给出一张带权无向图,每次询问\((u, v)\)之间是否存在一条路径满足\(max(a) = A, max(b) = B\) Sol 这题居然是分块..想不到想不到..做这题的心路历程 ...

  6. 洛谷P3247 最小公倍数 [HNOI2016] 分块+并查集

    正解:分块+并查集 解题报告: 传送门! 真的好神仙昂QAQ,,,完全想不出来,,,还是太菜了QAQ 首先还是要说下,这题可以用K-D Tree乱搞过去(数据结构是个好东西昂,,,要多学学QAQ),但 ...

  7. 洛谷P4168 蒲公英 [Violet] 分块

    题解:分块+离散化 解题报告: 一个分块典型题呢qwq还是挺妙的毕竟是道黑题 然,然后发现忘记放链接了先放链接QAQ 有两三种解法,都港下qwq 第一个是O(n5/3)的复杂度,谢总说不够优秀没有港, ...

  8. 洛谷 - P3935 - Calculating - 整除分块

    https://www.luogu.org/fe/problem/P3935 求: \(F(n)=\sum\limits_{i=1}^{n}d(i)\) 枚举因子\(d\),每个因子\(d\)都给其倍 ...

  9. 洛谷P3935 Calculation [数论分块]

    题目传送门 格式难调,题面就不放了. 分析: 实际上这个就是这道题的升级版,没什么可讲的,数论分块搞就是了. Code: //It is made by HolseLee on 18th Jul 20 ...

随机推荐

  1. js 中的! 和 !! 的区别

    Js中!的用法是比较灵活的,它除了做逻辑运算常常会用!做类型判断,可以用!与上对象来求得一个布尔值,1.!可将变量转换成boolean类型,null.undefined和空字符串取反都为false,其 ...

  2. (Frontend Newbie)Web三要素(三)

    上一篇简单介绍了Web三要素中的层叠样式表,本篇主要介绍三要素中最后一个,也是最难掌握的一个-----JavaScript. JavaScript 老规矩不能破,先简要交代 JavaScript 的历 ...

  3. 通过宏定义将__declspec(dllexport)与__declspec(dllimport)的转化,实现库代码和使用代码使用同一份头文件

    我们知道,在VC编程中,如果要编译成动态链接库,需要将函数.变量.类等导出,这时使用__declspec(dllexport).使用动态链接库时,需要在声明的时候有使用__declspec(dllim ...

  4. roboframework-ride运行案例时报 Error 267 错误问题

    偶然间碰到这个问题,检查下路径是否有中文,如有中文换成英文试试. (ps:通常自己创建的中文路径也是可以的,我的案例是从Linux环境中创建拷贝过来的,可能导致案例路径编码问题)

  5. 百度地图api-动态添加覆盖物

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  6. xss攻击汇总--转

    (1)普通的XSS JavaScript注入<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>(2)IMG标签XSS使用JavaScr ...

  7. 邓俊辉数据结构学习-7-BST

    二叉搜索树(Binary-Search-Tree)--BST 要求:AVL树是BBST的一个种类,继承自BST,对于AVL树,不做太多掌握要求 四种旋转,旋转是BBST自平衡的基本,变换,主要掌握旋转 ...

  8. Spring课程 Spring入门篇 5-3 配置切入点 pointcut

    1 解析 1.1 xml常见的配置切入点写法 2 代码演练 2.1 xml配置切入点   1 解析 1.1 xml常见的配置切入点写法 2 代码演练 2.1 xml配置切入点 xml配置: <? ...

  9. 最新机动车行驶证模板PSD可编辑分层文件下载

    机动车行驶证PSD模板下载地址: http://www.qijieworld.com/thread-1834752-1-1.html 模板为psd格式,内容可编辑修改,需使用 Photoshop CS ...

  10. The nineteenth day

    Twinkle,twinkle,little start! 闪烁,闪烁,小星星 How I wonder what you are, 我想知道你是什么 Up above the world so hi ...