【题目链接】
【题目大意】
给出两个操作,操作一给出区间[l,r],对l到r中的每一个下标i,
i,2*i,3*i……位置都增加x,操作二要求查询一个位置的当前值
【题解】
在修改的时候,我们将增量只标识在i上,查询的时候,查询下标的因子和即可。
考虑到这种查询方法需要sqrt(n)枚举判断因子,用二叉数据结构可能会超时, 因此我们用分块nsqrt(n)修改,O(1)查询特定位置。
【代码】
#include#include #include #include using namespace std;typedef long long LL;const int MAX_SIZE=550,MAX_N=300010;LL block[MAX_SIZE],u[MAX_SIZE][MAX_SIZE];int n,m,a[MAX_N],op,x,l,r,size;void add(int l,int r,int v){ int L=l/size,R=r/size; if(L==R)for(int i=l%size;i<=r%size;i++)u[L][i]+=v; else{ for(int i=l%size;i