URAL 2062 Ambitious Experiment(分块)
【题目链接】 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(分块)的更多相关文章
- ural 2062 Ambitious Experiment
2062. Ambitious Experiment Time limit: 3.0 secondMemory limit: 128 MB During several decades, scient ...
- ural2062 Ambitious Experiment
Ambitious Experiment Time limit: 3.0 secondMemory limit: 128 MB During several decades, scientists f ...
- Ural 2062:Ambitious Experiment(树状数组 || 分块)
http://acm.timus.ru/problem.aspx?space=1&num=2062 题意:有n个数,有一个值,q个询问,有单点询问操作,也有对于区间[l,r]的每个数i,使得n ...
- ural Ambitious Experiment 树状数组
During several decades, scientists from planet Nibiru are working to create an engine that would all ...
- 【树状数组】【枚举约数】 - Ambitious Experiment
给定一个序列,支持以下操作: 对区间[l,r]的每个i,将1i,2i,3i,...这些位置的数都加d. 询问某个位置的数的值. 如果把修改看作对区间[l,r]的每个数+d,那么询问x位置上的数时,显然 ...
- URAL 2062 树状数组
一个长度为n的数组 每次对lr区间进行修改 如果要修改i 则对i i*2 i*3...都修改 最后单点查询值 思想是利用树状数组维护每一个区间的更新值 查询的时候得出这个点的所有因子的查询值的和 加上 ...
- PHP搭建大文件切割分块上传功能
背景 在网站开发中,文件上传是很常见的一个功能.相信很多人都会遇到这种情况,想传一个文件上去,然后网页提示"该文件过大".因为一般情况下,我们都需要对上传的文件大小做限制,防止出现 ...
- POJ2104 K-th Number [分块做法]
传送:主席树做法http://www.cnblogs.com/candy99/p/6160704.html 做那倒带修改的主席树时就发现分块可以做,然后就试了试 思想和教主的魔法差不多,只不过那个是求 ...
- HDU 4467 分块
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4467 题意:给定n个点m条边的无向图,点被染色(黑0/白1),边带边权.然后q个询问.询问分为两种: ...
随机推荐
- BZOJ1875: [SDOI2009]HH去散步 图上边矩乘
这道题十分的坑…… 我作为一只连矩乘都不太会的渣渣看到这道题就只能神搜了….. 首先说一下普通的矩乘求方案,就是高出邻接矩阵然后一顿快速幂….. 矩乘一般就是一些秘制递推….. 再说一下这道题,我们可 ...
- Codeforces Round #515 (Div. 3) E. Binary Numbers AND Sum
E. Binary Numbers AND Sum 题目链接:https://codeforces.com/contest/1066/problem/E 题意: 给出两个用二进制表示的数,然后将第二个 ...
- libusb 示例
#include <usb.h> #include <stdio.h> #define VERSION "0.1.0" #define VENDOR_ID ...
- 前端面试:区分XSS和CSRF
xss:跨站点攻击.xss攻击的主要目的是想办法获取目标攻击网站的cookie,因为有了cookie相当于有了session,有了这些信息就可以在任意能接进互联网的PC登陆该网站,并以其他人的身份登陆 ...
- 调整文本输入框placeholder的颜色等样式
input::-webkit-input-placeholder{ color: white !important;}input:-moz-placeholder{ color: whi ...
- 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数
一.利用Modal形式展示控制器 1.如何展示// vc就是要展示的新控制器[self presentViewController:vc animated:YES completion:^{ N ...
- [bzoj1977][BeiJing2010组队]次小生成树 Tree——树上倍增+lca
Brief Description 求一个无向图的严格次小生成树. Algorithm Design 考察最小生成树的生成过程.对于一个非树边而言,如果我们使用这一条非树边去替换原MST的路径上的最大 ...
- 哪些情况会导致OOM
1. 堆溢出 java堆用于存储对象实例,只要不断地创建对象,并且这些对象不会被回收(什么情况对象不会被回收呢?如:由于GC Root到对象之间有可达路径,所以垃圾回收机制不会清除这些对象),那么,当 ...
- git应用基础配置
1.注册github账号.注册的时候会要求输入用户名和email这是配置git必须的要素 2.在使用git的时候首先需要把注册时候配合的用户名和密码填在git仓库的配置文件里,如下 harvey@ha ...
- 基于Docker 搭建 wordpress
在Docker中,一般遵循一个Docker只运行一个应用,这样方便维护. 首先需要将centos 镜像pull到本地,并搭建本地yum仓库 yum仓库地址:http://192.168.2.11:80 ...