两个操作

1对x位置的a[x]+y

2对所有i=y(mod x)求a[i]的和

我们肯定不能n^2 跑,稳超时,但是我们可以这样分块考虑。

为什么n^2不行?因为在x比较小的时候,这个求和操作次数太多了。但是x比较大的时候,这个对时间并没有什么影响

所有我们考虑分块。

用一个dp[i][j]表示(1-5e5的长度分成了长度为x的块,且块内偏移为j)的所有位置的和。

那么操作1,对a[pos]+=x后,需要对所有块长1到sqrt(len)的pos所处的块内偏移位置进行维护,以保证在询问块长1-sqrt(len)的时候,我们都能o(1)回答

如果块长大于sqrt(len)后,我们数组已经开不下,并且维护的时间将超出O(sqrt(5e5)) ,我们考虑直接暴力

因为此时块长大于sqrt(len)后,我们暴力加和的次数最大也就sqrt(5e5),并且随着块长数越大,次数也就越少

通过这个两种情况,我们就把时间复杂度下降到了o(sqrt(5e5))=700*5e5次查询,4秒也是可以接受的。(其实我感觉是接受不了的,谁叫cf跑的快)。。。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 5e5+;
LL dp[][];
LL a[maxn];
int main(){
int t,op;
LL x,y;
scanf("%d",&t);
while(t--){
scanf("%d",&op);
if(op==){
scanf("%lld%lld",&x,&y);
a[x]+=y;
for(int i=;i<;i++){
dp[i][x%i]+=y;
}
}else {
scanf("%lld%lld",&x,&y);
if(x<){
printf("%lld\n",dp[x][y]);
}else {
LL ans=;
for(int i=y;i<=5e5;i+=x){
ans+=a[i];
}
printf("%lld\n",ans);
}
}
}
return ;
}

最新文章

  1. 如何区别char与varchar?
  2. C可变参数的函数
  3. jq异步上传文件(转载)
  4. 地址(Address)——统一资源表示(URI)——WCF学习笔记(2)
  5. VBScript - CUD registry key and value
  6. pure virtual、impure virtual、non-virtual函数的接口继承和实现继承
  7. php异步加载、多线程fsockopen()、fputs()
  8. 闭包中的 this 对象
  9. PAT1013 数素数
  10. Unexpected end of input 和 Unexpected token var 和 Unexpected token ;
  11. 用UiPath导入RPA实践1:VirtualBox的安装
  12. python Django知识点总结
  13. @vue/cli 3.0 使用 svg-sprite-loader 加载本地 SVG 文件
  14. js圆形头像实现
  15. P4233 射命丸文的笔记
  16. 白鹭wing的自动编译
  17. 关于QQ屏蔽某些文件上传一些有意思的事
  18. Java8时间的简单时间
  19. comparable和comparator
  20. python之demo1----改编自turtle.py文件中的demo

热门文章

  1. MySQL错误1055
  2. Uva437 The Tower of Babylon
  3. 洛谷P3795 钟氏映射
  4. 洛谷P2196 挖地雷 [2017年4月计划 动态规划13]
  5. IntelliJ IDEA中设置同时打开多个文件且分行显示
  6. 高维护性的javascript
  7. Android 程序员不得不收藏的个人博客(持续更新...)
  8. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块
  9. mysql全连接
  10. 只在需要的时候 Polyfill 你的 JavaScript 代码