题目大意:

给定一个序列$a_1,a_2,\dots,a_n$,进行$m$次操作,每次操作如下:

1. 给定$x,y,z$,对所有下标为$y,y+x,y+2x,\dots$的元素加上$z$(保证$y\leqslant x$)。
2. 给定$l,r$,求$(\sum\limits_{i=l}^r a_i)\bmod{1000000007}$的值。

解题思路:

分块+根号分治简单维护即可。

考虑对$x$的大小分类讨论。

若$x\geqslant \sqrt n$,则我们暴力给每个位置加,需要加的次数为$O(\sqrt n)$次。由于需要查询区间和,用分块维护,总修改、查询复杂度为$O(m\sqrt n)$。

若$x< \sqrt n$,我们需要用另外的方法维护。

注意到单次修改是针对整个序列的元素,所以对$x,y$相同的修改,我们可以累加它的贡献。

那么我们每次查询的时候,需要对于所有的$x$进行一遍查询。故我们需要做到单次$O(1)$。

我们对每个$x$,维护$y$的前缀、后缀和。对于一次询问,我们可以当成把序列分成了若干个大小为$x$的块。中间的整块元素,每个块里肯定所有的$y$都有,增加的贡献就是关于$x$的修改总和。所有块的贡献相同,可以$O(1)$算。边角的话,由于我们记录了前缀、后缀和,也可以$O(1)$算。两个端点在同一个块中,则直接前缀和相减即可。

总时间复杂度$O(m\sqrt n)$。

C++ Code:

#include<iostream>
const int siz=512,M=siz+2,N=2e5+5,Z=N/siz+2,md=1e9+7;
#define bel(x)((x-1)/siz+1)
inline void upd(int&a){a+=a>>31&md;}
int n,blocks,L[Z],R[Z],a[N],sum[Z],m;
int pre[M][M],suf[M][M];
inline int sigma(int l,int r){
const int bL=bel(l),bR=bel(r);
int ret=0;
if(bL==bR)
for(int i=l;i<=r;++i)upd(ret+=a[i]-md);
else{
for(int i=R[bL];i>=l;--i)upd(ret+=a[i]-md);
for(int i=L[bR];i<=r;++i)upd(ret+=a[i]-md);
for(int i=bL+1;i<bR;++i)upd(ret+=sum[i]-md);
}
return ret;
}
int main(){
std::ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0);
std::cin>>n>>m;
blocks=bel(n);
for(int i=1;i<=blocks;++i)L[i]=R[i-1]+1,R[i]=i*siz;R[blocks]=n;
for(int i=1;i<=n;++i)std::cin>>a[i];
for(int i=1;i<=blocks;++i)
for(int j=L[i];j<=R[i];++j)upd(sum[i]+=a[j]-md);
while(m--){
int op;
std::cin>>op;
if(op==1){
int x,y,z;
std::cin>>x>>y>>z,z-=md;
if(x>=siz)
for(int i=y;i<=n;i+=x)upd(a[i]+=z),upd(sum[bel(i)]+=z);
else{
int*pr=pre[x],*sf=suf[x];
for(int i=x;i>=y;--i)upd(pr[i]+=z);
for(int i=1;i<=y;++i)upd(sf[i]+=z);
}
}else{
int l,r;
std::cin>>l>>r;
int ans=sigma(l,r);
for(int i=1;i<siz;++i){
const int bL=(l-1)/i+1,bR=(r-1)/i+1;
if(bL==bR)upd(ans+=pre[i][(r-1)%i+1]-md),upd(ans-=pre[i][(l-1)%i]);else
ans=(ans+(bR-bL-1LL)*pre[i][i])%md,upd(ans+=pre[i][(r-1)%i+1]-md),upd(ans+=suf[i][(l-1)%i+1]);
}
std::cout<<ans<<'\n';
}
}
return 0;
}

[Ynoi2011]D1T1的更多相关文章

  1. [2018HN省队集训D1T1] Tree

    [2018HN省队集训D1T1] Tree 题意 给定一棵带点权树, 要求支持下面三种操作: 1 root 将 root 设为根. 2 u v d 将以 \(\operatorname{LCA} (u ...

  2. 嵊州D1T1 总统先生,一路走好!

    嵊州D1T1 总统先生,一路走好! 在总统先生的所有财产就是 n 杯黑咖啡,咖啡店可以用 m 个空杯子换一杯黑咖啡. 因为总统的特殊身份,心地善良而心生怜悯的咖啡店店长决定先借给总统一杯黑咖啡,只要他 ...

  3. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  4. P5311 [Ynoi2011] 成都七中

    P5311 [Ynoi2011] 成都七中 题意 给你一棵 \(n\) 个节点的树,每个节点有一种颜色,有 \(m\) 次查询操作. 查询操作给定参数 \(l\ r\ x\),需输出: 将树中编号在 ...

  5. 从 洛谷P5309 Ynoi2011 初始化 看卡常

    一般情况下,程序运行消耗时间主要与时间复杂度有关,超时与否取决于算法是否正确. 但对于某些题目,时间复杂度正确的程序也无法通过,这时我们就需要卡常数,即通过优化一些操作的常数因子减少时间消耗. 比如这 ...

  6. NOIP2016 D1T1 玩具迷題(toy)

    题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉 ...

  7. 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和

    题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...

  8. 集训 D1T1 clique

    将点(xi,wi)看成区间(xi-wi,xi+wi),那么两个点有连边当且仅当两个区间没有公共点.删去所有包含其它区间的区间,在剩下的区间中每次贪心取一个能取的坐标最小的区间. #include< ...

  9. 计蒜客NOIP模拟赛5 D1T1 机智的 AmyZhi

    那年一个雨季,AmyZhi 在校门外弯身买参考书. 这时 SiriusRen 走过来,一言不合甩给她一道“自认为”很难的题: --------------- 给你一个数字 NN(NN 的范围是 11  ...

随机推荐

  1. hdu5119 Happy Matt Friends(dp)

    题目链接:点击打开链接 题目描写叙述:给出n个数.求从这n个数中随意取出一些数(至少取一个)相互异或之后大于m的方案数? 解题思路:分析因为n<=40&&m<=10^6,因 ...

  2. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  3. HDU 5289 Assignment (ST算法区间最值+二分)

    题目链接:pid=5289">http://acm.hdu.edu.cn/showproblem.php?pid=5289 题面: Assignment Time Limit: 400 ...

  4. linux下获取按键响应事件【转】

    本文转载自:https://my.oschina.net/u/157503/blog/91548 1.问题 通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序 代码 ...

  5. java-com-util-common-service:BaseService.java

    ylbtech-java-com-util-common-service:BaseService.java 1.返回顶部 1. package com.shineyoo.manager.util.co ...

  6. SnackDown Online Qualifier 2017

    好久没做题了,然后就想着随便做一个.无奈cf都是晚上,然后就看见这个,随便做做. 资格赛,只要做出来1题就行了,4天的时间. 1. 水题 #include <iostream> #incl ...

  7. 【Codeforces】Codeforces Round #373 (Div. 2) -C

    C. Efim and Strange Grade Efim just received his grade for the last test. He studies in a special sc ...

  8. Nginx作为负载均衡服务

    负载均衡服务器配置: 注意:upstream和server同级 案例: 建立两个基于端口的虚拟主机来模拟两台web服务器. (1)新建一个www.123.com:81和www.123.com:82的虚 ...

  9. C# 多线程系列(三)

    线程池 创建线程需要时间,如果有不同的小任务要完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多线程时增加,在需要释放资源时减少. 不需要自己创建这样的一个列表.该列表 ...

  10. Android 应用安装成功之后删除apk文件

    问题: 在应用开发中遇到需要这样的需求:在用户下载我们的应用安装之后删除安装包. 解决: android会在每个外界操作APK的动作之后发出系统级别的广播,过滤器名称: android.intent. ...