【题目链接】 http://acm.timus.ru/problem.aspx?space=1&num=2062

【题目大意】

  给出两个操作,操作一给出区间[l,r],对l到r中的每一个下标i,
  i,2*i,3*i……位置都增加x,操作二要求查询一个位置的当前值

【题解】

  在修改的时候,我们将增量只标识在i上,查询的时候,查询下标的因子和即可。
  考虑到这种查询方法需要sqrt(n)枚举判断因子,用二叉数据结构可能会超时,
  因此我们用分块nsqrt(n)修改,O(1)查询特定位置。

【代码】

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
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<size;i++)u[L][i]+=v;
for(int i=L+1;i<R;i++)block[i]+=v;
for(int i=0;i<=r%size;i++)u[R][i]+=v;
}
}
LL query(int x){
LL ans=0;
for(int i=1;i*i<=x;i++){
if(x%i==0){
int t=i-1;
ans+=block[t/size]+u[t/size][t%size];
if(i*i!=x){
int t=x/i-1;
ans+=block[t/size]+u[t/size][t%size];
}
}
}return ans;
}
int main(){
while(~scanf("%d",&n)){
memset(block,0,sizeof(block));
memset(u,0,sizeof(u));
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&m);
size=sqrt(n);
while(m--){
scanf("%d",&op);
if(op==1){
scanf("%d",&x);
printf("%lld\n",query(x)+a[x]);
}else{
scanf("%d%d%d",&l,&r,&x);
add(--l,--r,x);
}
}
}return 0;
}

URAL 2062 Ambitious Experiment(分块)的更多相关文章

  1. ural 2062 Ambitious Experiment

    2062. Ambitious Experiment Time limit: 3.0 secondMemory limit: 128 MB During several decades, scient ...

  2. ural2062 Ambitious Experiment

    Ambitious Experiment Time limit: 3.0 secondMemory limit: 128 MB During several decades, scientists f ...

  3. Ural 2062:Ambitious Experiment(树状数组 || 分块)

    http://acm.timus.ru/problem.aspx?space=1&num=2062 题意:有n个数,有一个值,q个询问,有单点询问操作,也有对于区间[l,r]的每个数i,使得n ...

  4. ural Ambitious Experiment 树状数组

    During several decades, scientists from planet Nibiru are working to create an engine that would all ...

  5. 【树状数组】【枚举约数】 - Ambitious Experiment

    给定一个序列,支持以下操作: 对区间[l,r]的每个i,将1i,2i,3i,...这些位置的数都加d. 询问某个位置的数的值. 如果把修改看作对区间[l,r]的每个数+d,那么询问x位置上的数时,显然 ...

  6. URAL 2062 树状数组

    一个长度为n的数组 每次对lr区间进行修改 如果要修改i 则对i i*2 i*3...都修改 最后单点查询值 思想是利用树状数组维护每一个区间的更新值 查询的时候得出这个点的所有因子的查询值的和 加上 ...

  7. PHP搭建大文件切割分块上传功能

    背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...

  8. POJ2104 K-th Number [分块做法]

    传送:主席树做法http://www.cnblogs.com/candy99/p/6160704.html 做那倒带修改的主席树时就发现分块可以做,然后就试了试 思想和教主的魔法差不多,只不过那个是求 ...

  9. HDU 4467 分块

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...

随机推荐

  1. CSS网页宽度怎么定比较合适

    设计网页的时候,确定宽度是一件很苦恼的事.以nowamagic.net为例,根据Google Analytics的统计,半年多以来,访问者的屏幕分辨率一共有81种.最小的分辨率是122x160,这应该 ...

  2. import pymongo exceptions.ImportError: No module named pymongo

    最近用Scrapy写爬虫,将爬取的数据存入Mongodb中,使用的是pymongo这个库,但是运行的时候报错如标题所示 搜了好多网站包括stackoverflow都没有解决,后来发现自己用的是虚拟环境 ...

  3. php文件上传错误代码

    注意: 1.上传文件的时候,在html里面的form表单一定要标注:enctype='multipart/form-data' 2.有种说法,要求一定要在form表单里面,在file前面加上隐藏域如: ...

  4. springmvc4+hibernate4+activiti5.18(Maven)

    项目下载地址: http://files.cnblogs.com/files/walk-the-Line/springmvc_activiti5.18_hibernate4.zip

  5. 【uva11468-Substring】AC自动机+dp

    http://acm.hust.edu.cn/vjudge/problem/31655 题意:给定k个模板串,n个字符以及选择它的概率pro[i],要构造一个长度问L的字符串s,问s不包含任意一个模板 ...

  6. 【BZOJ】1708: [Usaco2007 Oct]Money奶牛的硬币

    [算法]DP [题解] 如果每个排列算一种,则令f[i]表示凑成面值为i的方案数,容易推出f[i]+=f[i-a[j]]. 现在是每个组合才算一种,令f[i][j]第二维表示只使用前j种面值,f[i] ...

  7. bzoj 1878 SDOI2009树状数组 离线操作

    本来想写2120的,结果想起来了这个 我们先对于询问左端点排序,用树状数组存区间字母个数,对于每种字母, 第一次出现的位置记录为1,剩下的记录为0,然后记录下,每种颜色 后面第一个和他相同颜色的位置 ...

  8. Linux中短横线(-)小记

    在Linux中短横线(-)可以表示输出流,具体用法如下. 搭配cat cat - 如果指定cat的文件为-,表示从标准输入读取(和直接使用cat,好像没什么区别) 搭配| echo 123 | cat ...

  9. 如何在本机搭建SVN服务器【转】

    转自:http://www.cnblogs.com/loveclumsybaby/archive/2012/08/21/2649353.html 目的:在没有正式的SVN服务器的情况下,完成代码的本地 ...

  10. 【“10”力全开 游戏“Ti”厉害】ZX53VE-新飞行堡垒笔记本(Windows 10 Home/新七代标压i7-7700HQ/GTX 1050Ti 4G/8G内存/1TB+128GB)

    [“10”力全开 游戏“Ti”厉害]ZX53VE-新飞行堡垒笔记本(Windows 10 Home/新七代标压i7-7700HQ/GTX 1050Ti 4G/8G内存/1TB+128GB) http: ...